gpt4 book ai didi

c# - 如何从非 UI 线程获取 UI SynchronizationContext 并且没有表单或 UI 创建的任何对象

转载 作者:行者123 更新时间:2023-11-30 14:59:10 27 4
gpt4 key购买 nike

我在非 UI 线程上,我需要创建并显示一个 SaveDialog。但是当我尝试显示它时:.ShowDialog() 我得到:

"An unhandled exception of type 'System.Threading.ThreadStateException' occurred in System.Windows.Forms.dll"

我没有在 UI 上创建对象,那么如何在 UI 线程上调用这个 SaveDialog?是否有我可以使用的全局 UI SynchronizationContext?

编辑:如果我有一个表单/控件对象来调用 invoke/begininvoke,我知道该怎么做。或者在 UI 线程中使用 SynchronizationContext.Current 引用。但我没有这些。

最佳答案

在 .NET 中,您将使用 SynchronizationContext 类并将其实例传递给您的方法,可能有点像这样。

public void DoSomeStuffOnBackgroundThread(SynchronizationContext synchronizationContext)
{
// Do some stuff here
// ...

// Show the dialog on the UI thread
var dialog = new SaveFileDialog();
synchronizationContext.Send(() => dialog.Show());

// Send is performed synchronously, thus this line of code only executes when the dialog was closed. You can extract the file name here
var fileName = dialog.FileName;
}

同步上下文是在 Windows 窗体框架启动时建立的。因此,当您的应用程序和 UI 消息循环启动时,只需在 UI 线程上调用 SynchronizationContext.Current 即可获取可传递给方法或对象的实例。

最后,我绝对建议将这个功能封装在一个接口(interface)后面,一个实现这个接口(interface)的类获得对同步上下文的引用。因此,您的生产代码不会被这些不必要的细节(如线程亲和性)污染。

如果您有任何疑问,请随时发表评论。

关于c# - 如何从非 UI 线程获取 UI SynchronizationContext 并且没有表单或 UI 创建的任何对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17147438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com