中易网

C# Task线程问题,急!

答案:2  悬赏:30  
解决时间 2021-02-20 03:32
我需要在Task线程的执行方法里创建和使用WebBrowser控件,但是运行后会报错:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”。
请问各位前辈们如何解决这个问题?谢谢了!
最佳答案
需要设置子线程 ApartmentState 为 STA 模式,但 Task 又不能直接设置 ApartmentState,因此需要用 Thread 来封装一下。
using System.Threading;
using System.Threading.Tasks;

public static Task StartSTATask(Func func)
{
    var tcs = new TaskCompletionSource();
    var thread = new Thread(() =>
    {
        try
        {
            tcs.SetResult(func());
        }
        catch (Exception e)
        {
            tcs.SetException(e);
        }
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    return tcs.Task;
}

var task = StartSTATask(() =>
{
    WebBrowser browser = new WebBrowser();
    return browser;
});
全部回答
呵呵 用委托就完了(使用回调函数来关闭你的窗口 ) 1. new action(() => { //do something }).begininvoke(r => { if (r.iscompleted) { console.writeline("close you window"); } }, null); 2.使用取消架构 /// <summary> /// 取消构架 /// </summary> private cancellationtokensource importcts = new cancellationtokensource(); void myfunc() { task task = new task(new action(() => { if (importcts.iscancellationrequested) { //close you window } if (true) { importcts.cancel(); //set importcts.cancel() } }),importcts.token); task .start(); }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
广众商店地址有知道的么?有点事想过去
L签注可不可以自己组团去香港
鸦雀塘在哪里啊,我有事要去这个地方
李记宜良人家怎么去啊,有知道地址的么
qq仙侠传为什么贵重物品老是挂不上去
网上报税输入密码显示“错误代码:05035错误
请问一下大件行李怎么邮寄好?
王小波的散文随笔集是哪部
白糖和土豆一块吃了发现呕吐怎么办
西大窑中心药房我想知道这个在什么地方
1990年阳历9月25日农历八月初七早上四点多出
三星sm一g7108v无线网络不能自动连
A狗说了什么了,就凉了
内蒙古呼和浩特特产去哪儿买
想要取得国内的MBA证书,要怎么办?
推荐资讯
用vba编写点线的缓冲区
虬津星火家电地址在什么地方,想过去办事
会创作诗词的高手进!
我是在招商银行办的招商证券的。我现在在韶关
书法家齐国松,朋友送了我两幅他写的字,想了
怎么去秦岭大峪水库
+ 156是那个国家的电话
建筑面积70平米刷多少乳胶漆?
一个关于龙珠的电影 里面有悟空 龟仙人
在泰达招聘上看到一般都需要工作经验,难道没
华为荣耀六移动4G版实体店里卖多少钱??
这是啥猫!!!!o(〒㉨〒)o
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?