c# - 在 C# Winforms 中,让异步方法保证其在 UI 线程上执行的最精确方法是什么?

标签 c# multithreading winforms asynchronous

在我的研究中,似乎有大约一百万种不同的方法可以实现这一点,但每种方法的优缺点都不太清楚。似乎可以实现我所追求的一种可能性是:

private async Task SomeMostlyUIMethod(byte[] someParam = null)
{
    if (InvokeRequired)
    {
        Task result = Task.Run(() => Invoke((Action)(async () => await SomeMostlyUIMethod(someParam))));
        await result;
        return;
    }
    else
    {
        // do some stuff
    }
}

这似乎行得通,感觉应该有一个更明确的解决方案。我没有在每个控件修改的基础上调用,因为该方法修改了大量不同的 UI 组件,但也需要保持该方法异步,因为它也执行一些昂贵的非 ui 任务。

最佳答案

要使工作项在 UI 线程上执行,您可能需要当前同步上下文:

factory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());

并使用那个 factoryStartNew GUI 控件更新中涉及的任何任务。

关于c# - 在 C# Winforms 中,让异步方法保证其在 UI 线程上执行的最精确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41054735/

相关文章:

c# - 日期时间支持的格式化语言?

c# - 在 Xamarin.Forms 中使用 MVVM 进行页面导航

c# - .Net C# ReadProcessMemory指针函数向后返回地址

ruby - 我如何管理 ruby​​ 线程以便它们完成所有工作?

java - 程序顺序规则在构造函数中起作用之前是否发生?

java - Java 中有什么方法可以记录*每个*线程中断吗?

c# - 如何使用 AutomationId 识别 WinForms DevExpress 控件?

c# - 如何在用户控件完全可见后执行方法

c# - 在不阻塞 UI 线程的情况下异步使用 HttpWebRequest

c# - SQLite Interop DLL 缺少方法 - Windows Mobile CF