C# Task线程问题,急!

我需要在Task线程的执行方法里创建和使用WebBrowser控件,但是运行后会报错:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a96b-00c04fd705a2”。
请问各位前辈们如何解决这个问题?谢谢了!

需要设置子线程 ApartmentState 为 STA 模式,但 Task 又不能直接设置 ApartmentState,因此需要用 Thread 来封装一下。

using System.Threading;
using System.Threading.Tasks;

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;
}

var task = StartSTATask<WebBrowser>(() =>
{
    WebBrowser browser = new WebBrowser();
    return browser;
});

温馨提示:内容为网友见解,仅供参考
无其他回答

C# Task的运行是多线程吗?
任务只能说是“异步的”,不见得要在其他线程上运行,一个立即返回的任务,可以直接在当前线程上执行,如Task.FromResult(0),你可以await它,但是该Task实际上是立即完成了,所以.net运行时并不会为它创建一个线程。

C# Task使用方法
一种实现方式是构建一个委托的栈(也可以使用队列、链表等),在创建的线程中轮询栈中是否有未完成的委托,若有则取出并执行委托。只要向栈中添加委托,它们就会在创建的线程中运行。接下来是任务(Task)的介绍。任务是对前面操作的封装,包含了要运行的委托以及将委托放入线程运行的封装。任务通常被放置...

C#使用Task执行并行任务的原理和详细举例
在C#中,使用Task执行并行任务的原理是将任务分为多个小块,每个小块可在不同线程上运行。使用Task.Run方法将任务提交给线程池,线程池自动管理线程创建与销毁,优化CPU资源利用。以下示例展示如何使用Task执行并行任务,如斐波那契数列、阶乘计算、文件读取等,以及异步方法的实现,包含注意事项和最佳实践。执...

C#的 Task,Thread,ThreadPool 之间有什么异同
前台线程:主程序必须等待线程执行完毕后才可退出程序。Thread默认为前台线程,也可以设置为后台线程 后台线程:主程序执行完毕后就退出,不管线程是否执行完毕。ThreadPool默认为后台线程 线程消耗:开启一个新线程,线程不做任何操作,都要消耗1M左右的内存 ThreadPool为线程池,其目的就是为了减少开启新线程...

C# Task用法详解
Task的使用示例中,我们可以看到它在多线程环境中的优势。创建多个Task实例,这些Task实例默认会利用ThreadPool创建线程,有效地减少了资源消耗和线程创建开销。创建的是背景线程,无需手动管理。Task提供了丰富的API,如WaitAll、WaitAny、ContinueWith等,用于控制和协调多个任务的执行。以WaitAll为例,它等待...

c# 使用task怎么判断是否异常退出?
Task中捕获异常一般用以下方法:Task t1= Task.Factory.StartNew(() => { throw new Exception("执行失败");});try { \/\/主线程等待,可以 捕捉异常 t1.Wait();} catch (AggregateException ex){ foreach (var item in ex.InnerExceptions){ Console.WriteLine("异常类型:{0}{1}来自: {2...

c#中task怎么实现回调的
task是任务,多线程可以 用 wait()强行等待 线程结束跟 同步 就一样了 ,也可以自定义一个事件,task处理完毕触发事件

c# 中我开了线程task 用udpclient接收消息,请问怎么安全关闭这个线程以 ...
udpclient.Close();\/\/关闭协议 udpclient.Dispose();\/\/释放协议 udpclient = null;\/\/为协议至空值 t.DisableComObjectEagerCleanup();\/\/直接释放掉当前线程

task里无法显示窗口c#
你问task里无法显示窗口c#1的方法吗?task里无法显示窗口c#1的方法如下:1、创建一个单独的窗口线程,将窗口显示在该线程中,然后启动Task并在Task中调用该线程。2、使用TaskScheduler来创建和管理需要与窗口关联的计划任务。TaskScheduler可以在系统空闲时启动程序并显示窗口,实现计划任务的同时显示窗口.

C# Task类 如何在线程结束后关闭窗口
\/\/do something }).BeginInvoke(r => { if (r.IsCompleted){ Console.WriteLine("Close you WIndow");} }, null);2.使用取消架构 \/\/\/ \/\/\/ 取消构架 \/\/\/ private CancellationTokenSource importCts = new CancellationTokenSource();void myFunc(){ Task task = new Task(new Action(()...

相似回答