我需要在Task线程的执行方法里创建和使用WebBrowser控件,但是运行后会报错:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”。
请问各位前辈们如何解决这个问题?谢谢了!
C# Task线程问题,急!
答案:2 悬赏:30
解决时间 2021-02-20 03:32
- 提问者网友:星空下的寂寞
- 2021-02-19 18:15
最佳答案
- 二级知识专家网友:心与口不同
- 2021-02-19 19:17
需要设置子线程 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;
});
using System.Threading;
using System.Threading.Tasks;
public static Task
{
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楼网友:年轻没有失败
- 2021-02-19 20:07
呵呵 用委托就完了(使用回调函数来关闭你的窗口 ) 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(); }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯