gpt4 book ai didi

C# : Show dialog on UI thread from another thread

转载 作者:太空狗 更新时间:2023-10-29 17:38:22 25 4
gpt4 key购买 nike

我是 C# 的新手,但我已经完成了大量的 Java。这是我的问题:我正在尝试从不是 UI 线程的线程打开“SaveFileDialog”。

这正是我尝试做的:

public partial class Form1: Form
{
public string AskSaveFile()
{
var sfd = new SaveFileDialog();
sfd.Filter = "Fichiers txt (*.txt)|*.txt|Tous les fichiers (*.*)|*.*";
sfd.FilterIndex = 1;
sfd.RestoreDirectory = true;
DialogResult result = (DialogResult) Invoke(new Action(() => sfd.ShowDialog(this)));
if(result == DialogResult.OK)
{
return sfd.FileName;
}

return null;
}
}

此方法将始终从与拥有表单的线程不同的线程中调用。问题是当我执行这段代码时,“Form1”卡住并且“SaveFileDialog”没有出现。

你有什么线索可以帮助我从一个独立的线程中显示对话框吗?

最佳答案

让它看起来像这样:

    public string AskSaveFile() {
if (this.InvokeRequired) {
return (string)Invoke(new Func<string>(() => AskSaveFile()));
}
else {
var sfd = new SaveFileDialog();
sfd.Filter = "Fichiers txt (*.txt)|*.txt|Tous les fichiers (*.*)|*.*";
sfd.FilterIndex = 1;
sfd.RestoreDirectory = true;
return sfd.ShowDialog() == DialogResult.OK ? sfd.FileName : null;
}
}

如果您仍然遇到死锁,请务必使用调试器的调试 + Windows + 线程窗口并查看 UI 线程正在做什么。 Control.Invoke() 无法完成,除非 UI 线程处于空闲状态并启动消息循环。等待工作线程完成总是会导致死锁。

还要考虑到这种代码是有风险的,用户可能不希望此对话框突然出现并在 UI 线程拥有的窗口中使用鼠标或键盘操作时意外关闭它。

关于C# : Show dialog on UI thread from another thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7214901/

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