我想模拟这段代码:
Task t = Task.Factory.StartNew(...)
t.Wait()
根据这个问题任务不能设置公寓状态。可以使用线程设置单元状态,但我需要任务中的等待功能。有没有办法使用线程模拟 Wait() 函数?
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
。)