加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在SetWindowPos()中使跨线程操作无效

发布时间:2020-12-16 00:12:14 所属栏目:百科 来源:网络整理
导读:我试图从一个不同的线程访问一个表单到创建表单的表单,最后得到一个错误: Cross thread operation not valid 码: public static void MakeTopMost(Form form){ SetWindowPos(form.Handle,HWND_TOPMOST,TOPMOST_FLAGS);} 我正在传递一个在另一个线程中运行
我试图从一个不同的线程访问一个表单到创建表单的表单,最后得到一个错误:

Cross thread operation not valid

码:

public static void MakeTopMost(Form form)
{
    SetWindowPos(form.Handle,HWND_TOPMOST,TOPMOST_FLAGS);
}

我正在传递一个在另一个线程中运行的表单.我试过测试InvokeRequired,但它总是假的.

我是线程新手.

解决方法

确保您正在为InvokeRequired测试正确的对象:

public static void MakeTopMost(Form form)
{
    if (form.InvokeRequired)
    {
        form.Invoke((Action)delegate { MakeTopMost(form); });
        return;
    }

    SetWindowPos(form.Handle,TOPMOST_FLAGS);
}

我喜欢用这样的扩展方法包装所有这些:

public static class SynchronizeInvokeUtil
{
    public static void SafeInvoke(this ISynchroniseInvoke sync,Action action)
    {
        if (sync.InvokeRequired)
            sync.Invoke(action);
        else
            action();
    }

    public static void SafeBeginInvoke(this ISynchroniseInvoke sync,Action action)
    {
        if (sync.InvokeRequired)
            sync.BeginInvoke(action);
        else
            action();
    }
}

然后你可以打电话:

form.SafeInvoke(() => SetWindowPos(form.Handle,TOPMOST_FLAGS));

这可能是最具可读性的.

请注意,如果您在表单类本身中使用它,则必须使用this.SafeInvoke(…)才能访问扩展方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读