【发布时间】:2011-10-06 18:49:23
【问题描述】:
我的项目是一个三层架构项目,它与后端的 WCF 服务通信。当后端能够从服务中获取数据时,它会使用发布-订阅通知业务层,然后通知 GUI 层。
我使用 Visual Studios 设计器在我的 UI 设计中添加了一个 OpenFileDialog。按钮事件处理程序调用 ShowDialog 消息。但是,一旦我单击按钮,整个 UI 就会挂起。
搜索了一下,我发现使用委托是处理此类任务的首选方式。但是,无论有没有委托,问题仍然存在。
目前我的代码如下所示:
private void bOpen_Click(object sender, EventArgs e)
{
Func<Image> del = delegate
{
OpenFileDialog d = new OpenFileDialog();
if (d.ShowDialog() == DialogResult.OK)
{
return Image.FromFile(d.FileName);
}
return null;
};
Invoke(del);
}
我来自 Java 世界,所以我不太熟悉 C# UI 编程的复杂性。
我在这里遗漏了什么?
【问题讨论】:
-
我很好奇,为什么不直接
private void bOpen_Click(object sender, EventArgs e) { OpenFileDialog d = new OpenFileDialog(); if (d.ShowDialog() == DialogResult.OK) { Image.FromFile(d.FileName); } }; -
它挂起而不使用委托。我创建了委托,因为我发现几个网站说这是执行由 GUI 触发的冗长操作的首选方式。有点像 Java 中的 SwingWoker,我想。
-
提到的站点的首选方式必须是在单独的线程中启动委托。类似
new Thread(del).Start(); -
但是UI挂了很奇怪,因为
OpenFileDialog必须自己运行一个内部消息循环。 -
您是否将 STA 线程属性正确应用于 GUI 进程的主进程? msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx
标签: c# .net winforms user-interface