我有一个 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?,但我不太倾向于更改线程池。
据我所知,没有建议的处理方法。