C#线程池跨线程通信

Goo*_*ber 2 c# multithreading

情景

我有一个Windows窗体应用程序,其中包含一个带有列表框的MAINFORM.MAINFORM还有一个THREAD POOL,可以创建新的线程并将其激活,以执行大量不同的处理.虽然这些不同的工作线程中的每一个都正在完成其工作,但我想将此进展报告给我的MAINFORM,但是,我不能,因为它需要跨线程通信.

进展

到目前为止,我所看到的与此主题相关的所有教程等都涉及自定义(ish)线程实现,而我确实有一个相当基本的(ish)标准THREAD POOL实现.因为我不想真正修改我的任何代码(因为应用程序像没有quarms的野兽一样运行) - 我正在考虑如何进行这种跨线程通信.另外 - 如何完全实现不同的"LOGTOSCREEN"方法(显然仍然牢记跨线程通信的事情).

警告:

我在工作中使用这个网站,我们只被锁定到IE6,因此javascript失败,这意味着我无法在工作期间点击接受任何答案,因此我的接受率很低.对此我无能为力,我很害怕,抱歉.

编辑:

我没有在工作中安装我的计算机上的权利.我有Firefox,但在Firefox上使用此站点时代理工作失败.不,有趣的是,我家里没有互联网,我真的只是搬到了这个城市而且公寓是新建的,所以地址还没有在邮局注册,因此电话公司不能找到他们系统上的地址,直到他们派出一名测量师,聪明的裤子.

进一步编辑:

我不想改变我的演绎实施.在所有! - 接受以启用跨线程通信....为什么后台工作者会在这里帮忙!?

代码相关编辑:

当我的THREAD POOL执行新线程时,它会创建一个类的新实例并在该新线程上调用整个事件........即您的代码示例不太合适. ...我认为?

Mik*_*all 5

使用.NET中的BackgroundWorker类并使用ProgressChangedRunWorkerCompleted事件与UI线程进行通信

编辑:

听起来你不喜欢BackgroundWorker,或者只是不想重构.在这种情况下,您必须检查窗体或其中一个控件上的InvokeRequired属性,如果为true,则必须调用Control.Invoke以强制在主线程上进行UI更新逻辑.

这是一个例子:

private void MyThreadFunction()
{
    if (!InvokeRequired)
    {
        myLabel.Text = "You pushed the button!";
    }
    else
    {
        Invoke(new ThreadStart(MyThreadFunction));
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用任何委托类型传递给Invoke,因为它接受在主线程上调用时可以传递给您的委托的可选参数.