如何使用线程模拟Task.Wait

时间:2013-05-23 19:46:06

标签: c# c#-4.0

我想模仿这段代码:

Task t = Task.Factory.StartNew(...)
t.Wait()

根据此question任务无法设置公寓状态。可以使用Threads设置Apartment state,但我需要在Tasks中使用Wait功能。有没有办法使用Threads模拟Wait()函数?

1 个答案:

答案 0 :(得分:5)

Thread.Join将阻止当前线程,直到另一个线程完成。

哦,为了记录,声明Tasks cannot set apartment state不正确。也许StartNew永远不会创建表示STA线程中的工作的任务,但是其他一些方法可以创建表示STA线程中的工作的Task。例如,这个做:

public static Task<T> StartSTATask<T>(Func<T> func)
{
    var tcs = new TaskCompletionSource<T>();
    Thread thread = new Thread(() =>
    {
        try
        {
            tcs.SetResult(func());
        }
        catch (Exception e)
        {
            tcs.SetException(e);
        }
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    return tcs.Task;
}

(您可以为Task创建一个看起来几乎相同的,或为StartNew的各种选项添加重载。)