测试线程敏感的任务执行

时间:2015-05-07 00:40:03

标签: c# multithreading unit-testing

我有一个函数应该启动一个由三个连接在一起的执行组成的任务,第一个委托在一个工作线程上执行,后续两个委托在主线程上执行。它看起来像这样:

public delegate object RunAsyncWorkerDelegate();
public delegate object RunAsyncMainDelegate(object arg);
public void RunAsync(RunAsyncWorkerDelegate workerFunction, RunAsyncMainDelegate mainFunction1, Action<object> mainFunction2)
{
   Task.Factory.StartNew<object>(x => { return workerFunction(); })
      .ContinueWith<object>(t => { return mainFunction1(t.Result) }, TaskScheduler.FromCurrentSynchronizationContext())
      .ContinueWith(t => { return mainFunction2(t.Result); }, TaskScheduler.FromCurrentSynchronizationContext());
}

此代码在生产中工作正常,但我希望能够验证代理是否在测试中的正确线程上执行。不幸的是,似乎没有任务 以与在主应用程序中执行时相同的方式同步。理想情况下,我可以做这样的事情:

[TestMethod]
public void TestRunAsync()
{
    var mainthreadId = Thread.ManagedThreadId;
    var mainFunction1Thread = 0;
    var mainFunction2Thread = 0;

    Action mainFunction1 = x => mainFunction1Thread = Thread.ManagedThreadId;
    Action mainFunction2 = x => mainFunction2Thread = Thread.ManagedThreadId;

    RunAsync(x => {}, mainFunction1, mainFunction2);

    // wait for runAsync to finish

    Assert.AreEqual(mainThreadId, mainFunction1Thread);
    Assert.AreEqual(mainThreadId, mainFunction2Thread);
}

尝试这一点向我展示了不同的委托实际上是在完全不同的线程上运行,尽管设置了SynchronizationContext

有没有更好的方法在测试中测试此行为?

0 个答案:

没有答案