Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在WinForms中是否有强制方法在主线程上运行的属性?_Multithreading_Winforms - Fatal编程技术网

Multithreading 在WinForms中是否有强制方法在主线程上运行的属性?

Multithreading 在WinForms中是否有强制方法在主线程上运行的属性?,multithreading,winforms,Multithreading,Winforms,我在一个应用程序上工作,该应用程序中有数千个方法分散在代码库中,应该在主线程上调用这些方法。许多类不必要地派生自某种类型的UI控件,因此,调用方法或属性可能会引发跨线程异常 我想通过做以下两件事中的一件来停止这个问题,而不改变一切: 向需要在主线程上调用的方法和属性添加注释。这是站不住脚的,但必须做到 我希望添加某种属性来自动将请求推送到主线程上 以下是可能的,如果是的话,我如何才能做到这一点 public class MyCustomClass : Form { [MustInvoke

我在一个应用程序上工作,该应用程序中有数千个方法分散在代码库中,应该在主线程上调用这些方法。许多类不必要地派生自某种类型的UI控件,因此,调用方法或属性可能会引发跨线程异常

我想通过做以下两件事中的一件来停止这个问题,而不改变一切:

  • 向需要在主线程上调用的方法和属性添加注释。这是站不住脚的,但必须做到
  • 我希望添加某种属性来自动将请求推送到主线程上
  • 以下是可能的,如果是的话,我如何才能做到这一点

    public class MyCustomClass : Form
    {
        [MustInvokeOnMainThread]
        public string MyProperty
        {
            get { return ... }
        }
    
        [MustInvokeOnMainThread]
        public void MyMethod(string x, int y)
        {
            ...
        }
    }
    
    public class NotOnMainThreadClass
    {
        MyCustomClass form;
    
        ...
    
        public void Method()
        {
            // can this call automatically be invoked on main thread?
            form.MyMethod("asdf", 0);
        }
    }
    
    是否有与
    [MustInvokeOnMainThread]
    等效的东西?我厌倦了编写这样的代码:

    public void Method()
    {
        if (form.InvokeRequired)
        {
            from.Invoke(new Action(Method));
            return;
        }
    
        form.MyMethod("asdf", 0);
    }
    

    任何帮助都将不胜感激。提前谢谢

    没有这样的事。减少锅炉板的最佳方法可能是将锅炉板包裹在辅助设备中。这篇CodeProject文章为您提供了一个这样的例子:

    没有这样的东西。请看:David,我很抱歉在回复您的评论时出现了巨大的延迟。谢谢你的反馈,你说得很对:没有办法做到这一点。我希望你能贴出这个问题的答案,因为我会接受它。另外,感谢您的代码项目链接——非常有用。我会尽力说服这里的人使用它提供的东西!好的,我把我的评论变成了答案。这不是我写过的最有见地的回答,但你看。你自找的。;-)