【发布时间】:2022-01-25 10:43:21
【问题描述】:
我有一个需要在 WPF 应用程序中执行的第三方库。我知道下面的代码不会以 WPF 开头。可能值得记住,只是尝试将问题分解为一个较小的案例。
无论如何,他们没有太多的文档,或者我可以做的关于 3rd 方库,比它需要使用的要多。
因为有些任务在处理和时间方面相当长,所以我认为将这些任务放在单独的线程上管理以避免锁定 UI 是个好主意。 所以我的想法是让大部分工作可以在单独的处理线程中完成,并在安全的主 UI 线程上调用第 3 方库,然后将数据返回到线程以进行进一步处理。这是因为那里使用的代码可能不是完全线程安全的,无法从任何地方调用,到目前为止,这完全不走运。
所以我目前对此的想法是将需要的内容从 3rd 方库线程/任务分派到注册为主 UI 线程的内容,并收集数据并将其返回给处理线程。
预处理 -> 3pl -> 后处理。
这目前还没有完全起作用,因为没有例外或信息说明为什么它不起作用。因为它只是在ThirdPartyTest() 中运行InvokeOnMainTread 时死亡。
这里缺少什么才能让这个调用正常传递?
任何想法或帮助将不胜感激。
using System;
using System.Threading.Tasks;
using System.Windows.Threading;
namespace TestTPL
{
class Program
{
static void Main(string[] args)
{
ThreadMethods methods = new ThreadMethods();
methods.Execute();
}
}
public class ThreadMethods
{
private static ThirdPartyCaller caller;
public async void Execute()
{
//Doing some pre processing...
//Reach for 3rd party lib
caller = new ThirdPartyCaller();
int taskRes = await TestTask();
//Do some more processing of data
}
private async Task<int> TestTask()
{
return await Task.Run(() =>
{
int project = caller.ThirdPartyTest();
return project;
});
}
}
public class ThirdPartyCaller
{
private readonly Dispatcher dispatcher;
public ThirdPartyCaller()
{
dispatcher = Dispatcher.CurrentDispatcher;
}
protected TResult InvokeOnMainTread<TResult>(Func<TResult> action)
{
return dispatcher.Invoke(action);
}
public int ThirdPartyTest()
{
return InvokeOnMainTread(() =>
{
//Represents calculations done by a third pary library
return 2 + 6;
});
}
}
}
【问题讨论】:
-
能否补充更多关于第三方库API的信息?举一个类的例子,这个类的一些方法/属性,如果冻结不是问题,你将如何从 UI 线程使用这个类,可能会有帮助。
-
在this 答案中你可以找到
SingleThreadTaskScheduler类,这可能会给你一些想法。
标签: c# wpf multithreading