2013-01-17 16 views
1

我使用这种方式与访问本地变量来执行异步void的方法:ThreadAbortException调试

static void RunAsync(object var1, object var2) 
{ 
    ThreadStart work = delegate 
    { 
     try 
     { 
      Statement1(var1); 
      Statement2(var2); 
      // etc 
     } 
     catch (Exception e) { } 
    }; 
    new Thread(work).Start(); 
} 

调试通过在Visual Studio中往往会造成ThreadAbortException单元测试,但运行测试(和运行的代码)工作正常。

这是什么造成的?

+0

你可以得到从异常的一些信息? –

+0

不是真的:http://monosnap.com/image/w8jY9nRAonveWBrP7VfTssWp8/ –

+0

调试+异常,取消投掷复选框。 –

回答

2

发生这种情况的原因是,当您调用RunAsync方法时,它会创建线程,但返回到TestMethod,测试在线程完成之前完成。当测试结束时,它会尝试中止所有线程,以便得到该异常。您必须等到线程完成后才能使用Join。

建议:

Thread t; 
static void RunAsync(object var1, object var2) 
{ 
    ThreadStart work = delegate 
    { 
     try 
     { 
      Statement1(var1); 
      Statement2(var2); 
      // etc 
     } 
     catch (Exception e) { } 
    }; 
    t=new Thread(work); 
    t.Start(); 
} 
[TestMethod] 
public void TestMethod() 
{ 
    RunAsync(); 

    DoOtherStuff(); 
    if(t!=null) 
     t.Join(); 

} 
+0

这不会消除'RunAsync'方法的目的吗?就我所了解的问题而言,测试是异步并行运行的。为了让你的建议练习'RunAsync'应该返回'Thread'实例。测试运行者应该将所有'Thread'实例收集到一个列表中,然后等待它们全部完成。使用'TPL'和'Task'更简单:'Task.WaitAll(tasks)' –

+0

我编辑我的帖子,你可以尝试类似 – Milad

+0

的东西是的,类似的东西,但更灵活的处理多个异步测试。 (顺便说一句,我不是问题的人) –

相关问题