1

我想模拟这段代码:

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

根据这个问题任务不能设置公寓状态。可以使用线程设置单元状态,但我需要任务中的等待功能。有没有办法使用线程模拟 Wait() 函数?

4

1 回答 1

5

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

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

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。)

于 2013-05-23T19:48:37.837 回答