首页 新闻 会员 周边 捐助

c#如何设置task线程的ApartmentState属性

0
悬赏园豆:20 [待解决问题]

需要设置子线程 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()方法,请问该如何做??

通天大圣的主页 通天大圣 | 初学一级 | 园豆:0
提问于:2020-08-01 18:08
< >
分享
所有回答(4)
0

都是美艳,一个ps,一个xx相机,但是需要改高斯模糊参数,后者无法。通常封装越高,颗粒度越小。

花飘水流兮 | 园豆:13615 (专家六级) | 2020-08-01 19:27

Thread肯定是有该颗粒度的,Thread.Current可能可以获取Task的线程,但我估计后设置而不是初始化是不行的。而后者Task虽然是新建的,但Thread是可能不是新建的

支持(0) 反对(0) 花飘水流兮 | 园豆:13615 (专家六级) | 2020-08-01 19:30

@花飘水流兮: 那怎么解决

支持(0) 反对(0) 通天大圣 | 园豆:0 (初学一级) | 2020-08-01 21:03
0

我不明白什么叫创建Task线程来执行method()方法,Task和线程没有什么关系的。

Task封装的是任务,是工作内容,不是线程。一个Task可能在任何线程上执行,所以Task不会提供线程属性,也不该在异步方法中使用Thread类,更不应该在Task里面修改线程的ApartmentState属性,因为这个线程可能会执行其他的Task。

拓拓 | 园豆:1055 (小虾三级) | 2020-08-03 16:49
0

为什么也设置为 STA 模式?那别用Task,直接用Thread类不可以吗

会长 | 园豆:12463 (专家六级) | 2020-08-04 09:56
0

我也遇到这个问题,想异步执行webbroser这个控件,但是必须经过thread设置:

Thread t = new Thread(ps);

t.IsBackground = true;

t.SetApartmentState(ApartmentState.STA);//关键一步,但是要用到thread.start

想异步而不用线程是因为有一个环节要等待,task delay比thread sleep耗时少很多。

NUDT鸿哥 | 园豆:202 (菜鸟二级) | 2021-01-04 00:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册