【问题标题】:Working with TPL Using Embedded Tasks使用嵌入式任务处理 TPL
【发布时间】:2012-03-08 14:13:35
【问题描述】:

我在单独的线程上运行一个进程以促进并发和流畅的用户界面调用

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 有关,我还没有收到令人满意的答案。

【问题讨论】:

    标签: c# task task-parallel-library


    【解决方案1】:

    这很好,您只是开始了一个“即发即忘”的任务,它将在线程池线程上运行 - 但是在第一个示例中,您似乎期待一个结果(我假设一个布尔值指示连接测试是否是成功的) - 在第二个你不会有任何 - 除非你的任务,例如引发事件或调用预定义的回调。

    【讨论】:

    • 非常感谢您的宝贵时间。我是否必须处理 Task 还是从最宽松的意义上说它是“垃圾收集”?
    • 除非您使用事件句柄,否则您不必处理 Task - 另请参阅 stackoverflow.com/questions/3734280/…
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多