从 ASP.NET Core 代码调用 STA 组件(异步/非异步)

时间:2021-02-03 15:13:22

标签: c# multithreading asp.net-core .net-core async-await

我有一个 ASP.NET Core 5.0 应用程序,我在其中集成了一个 WPF 组件。该组件呈现图表。问题是 WPF 需要 STA(单线程单元)。 ASP.NET 使用的线程池是 MTA。这导致了异常:

<块引用>

调用线程必须是STA,因为很多UI组件都需要这个

我知道有很多解决方法,如下所示:

    public static Task<T> RunThreadWithSTA<T>(Func<T> f)
    {
        var completionSource = new TaskCompletionSource<T>();
        var thread = new Thread(() =>
        {
            try
            {
                completionSource.SetResult(f());
            }
            catch (Exception e)
            {
                completionSource.SetException(e);
            }
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        return completionSource.Task;
    }

它工作正常(适用于同步代码,但不适用于异步代码)。但是,这会从 ASP.NET 中删除线程,因为这被认为是不良做法

还建议了其他方法(从 10 年前开始),例如自定义 STA 线程池,请参阅 Can the WPF API be safely used in a WCF service?,但我不太倾向于更改线程池。

据我所知,没有建议的处理方法。

0 个答案:

没有答案