需要设置子线程 ApartmentState 为 STA 模式,但 Task 又不能直接设置 ApartmentState,因此需要用 Thread 来封装一下。
public static Task<T> StartSTATask<T>(Func<T> func)
{
var tcs = new TaskCompletionSource<T>();
var thread = new Thread(() =>
{
try
{
tcs.SetResult(func());
}
catch (Exception e)
{
tcs.SetException(e);
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return tcs.Task;
}
上面这几行代码是从网上找的,假如现在想要创建task线程来执行method()方法,请问该如何做??
都是美艳,一个ps,一个xx相机,但是需要改高斯模糊参数,后者无法。通常封装越高,颗粒度越小。
Thread肯定是有该颗粒度的,Thread.Current可能可以获取Task的线程,但我估计后设置而不是初始化是不行的。而后者Task虽然是新建的,但Thread是可能不是新建的
@花飘水流兮: 那怎么解决
我不明白什么叫创建Task线程来执行method()方法,Task和线程没有什么关系的。
Task封装的是任务,是工作内容,不是线程。一个Task可能在任何线程上执行,所以Task不会提供线程属性,也不该在异步方法中使用Thread类,更不应该在Task里面修改线程的ApartmentState属性,因为这个线程可能会执行其他的Task。
为什么也设置为 STA 模式?那别用Task,直接用Thread类不可以吗
我也遇到这个问题,想异步执行webbroser这个控件,但是必须经过thread设置:
Thread t = new Thread(ps);
t.IsBackground = true;
t.SetApartmentState(ApartmentState.STA);//关键一步,但是要用到thread.start
想异步而不用线程是因为有一个环节要等待,task delay比thread sleep耗时少很多。