2012-03-08 33 views
0

我在一个单独的线程中运行的进程,以促进并发性和流畅的用户界面调用与TPL使用嵌入式任务工作

private void ThreadedTestConnection(SqlConnection conn, bool bShowErrMsg) 
{ 
    Task<bool> asyncTestConn = Task.Factory.StartNew<bool> 
     (() => TestConnection(conn, bShowErrMsg)); 
    return asyncTestConn.Result; 
    asyncTestConn.Dispose(); 
} 
从UI线程

。然而,由return asyncTestConn造成的'等待'正在停止将UI线程释放回GUI。我提出了以下修复方案。从事件从GUI解雇我有(不包括try/catch块)

private void SomeClick_Event(object sender, EventArgs e) 
{ 
    Task testConnection = Task.Factory.StartNew 
     (() => UtilsDB.ThreadedTestConnection(mainConn, true)); 
} 

这工作。也就是说,它将控制权立即返回到GUI,同时在单独的后台线程上运行测试。做这件事我是一个非常愚蠢的男孩吗?还是这样好?

注意:这是一个单独的问题,但与this one有关,我还没有收到satasfactory答案。

回答

1

这是完全正常的,你刚开始一个“射后不理”,这将在一个线程池中的线程运行的任务 - 但是在第一个例子中,你似乎期望的结果(我假设一个布尔值,指示是否连接测试成功) - 在第二个你不会有任何 - 除非你的任务如引发事件或调用预定义的回调。

+0

非常感谢您的时间。我是否必须以最宽松的意义去处置“任务”或将其“垃圾收集”? – MoonKnight 2012-03-08 14:23:40

+1

除非你使用事件处理,你将不必处置'Task' - 又见http://stackoverflow.com/questions/3734280/is-it-considered-acceptable-to-not-call-dispose-on -a-TPL-任务对象 – BrokenGlass 2012-03-08 14:25:49