相关疑难解决方法(0)

backgroundworker完成事件处理程序的哪个线程运行?

我有一个GUI应用程序,需要运行长时间的计算(想想一分钟或更长时间),它处理这个问题的方法是将计算给予后台工作者.(这部分很好)

我的问题是,如果我执行类似的操作:this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler(this.doSomethingElse);

doSomethingElse将在主UI线程上运行,还是在后台工作程序运行的线程池中运行?

感谢您提供的任何帮助.

c# backgroundworker

9
推荐指数
2
解决办法
2639
查看次数

为什么BackgroundWorker在此单元测试中没有在正确的线程上调用RunWorkerCompleted?

backgroundWorker的重点是在完成一项耗时的任务后更新UI.该组件的工作方式与我的WPF应用程序中的广告相同.

但是在我的测试中,调用线程上没有调用回调.

[Test]
public void TestCallbackIsInvokedOnClientThread()
{

     var clientId = Thread.CurrentThread.ManagedThreadId;
     int callbackThreadId = -1;
     var manualEvent = new ManualResetEventSlim(false);

     var someUIControl = new TextBox();
     var bw = new BackgroundWorker();

     bw.DoWork += (s,e) => e.Result = 5 ; // worker thread

     bw.RunWorkerCompleted += (s, e) =>
                                  {
                                      try
                                      {
                                          callbackThreadId = Thread.CurrentThread.ManagedThreadId;
                                          //someUIControl.Text = callbackThreadId.ToString();
                                          manualEvent.Set();
                                      }
                                      catch (System.Exception ex)
                                      {
                                          Console.Out.WriteLine(ex.ToString());
                                      }
                                  };
     bw.RunWorkerAsync();

     if (!manualEvent.Wait(5000))
         Assert.Fail("no callback");
     Assert.AreEqual(clientId, callbackThreadId);
 }
Run Code Online (Sandbox Code Playgroud)

结果消息:Assert.AreEqual失败.预期:<15>.实际:<10>.在客户端线程上未调用回调

我错过了什么?

在单元测试中,我看到的行为就像

------ …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading

5
推荐指数
1
解决办法
1824
查看次数

标签 统计

c# ×2

.net ×1

backgroundworker ×1

multithreading ×1