我想模仿这段代码:
Task t = Task.Factory.StartNew(...)
t.Wait()
根据此question任务无法设置公寓状态。可以使用Threads设置Apartment state,但我需要在Tasks中使用Wait功能。有没有办法使用Threads模拟Wait()函数?
答案 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
的各种选项添加重载。)