我正在处理在窗体中运行控件,但窗体本身对我没有任何价值。我基本上希望表单能够运行一个任务并返回一个值,但是为了让我喜欢使用类似于AutoResetEvent的东西,只有在函数调用完成时才从函数调用中返回,这显然会阻塞表单线程并使其不可能完成任务。在单独的线程中运行窗体表单
回答
我认为最简单的解决方案是,一旦任务完成,只是从形式上引发事件。
void RunTask()
{
Form form = new Form();
form.TaskCompleted += new EventHandler(form_TaskCompleted);
form.Show();
}
void form_TaskCompleted(object sender, EventArgs e)
{
object result = ((Form)sender).GetResult();
}
编辑:当然你要处理的形式,一旦它完成等解开这一事件..
你为什么要在窗体中运行任务?
这听起来像是您的UI和程序逻辑紧密集成。这是糟糕的设计。
一般来说,您可以从工作线程获取数据的标准方式。 Worker将数据存储在线程安全的数据结构中,然后向主线程发送一个事件,指示数据可用。
用于网页抓取目的。 – Novikov 2010-10-21 19:22:45
我有我的两种念头:
运行的委托方法
IAsyncResult ar = del.BeginInvoke(callback, state);
...做任务
EndInvoke(ar);
//等待任务结果如果你允许等待单独的线程
最好的方法可能是使用单独的线程来完成任务并在此线程中调用委托通知主线程完成工作。
编辑:或像工作者建议我的前任
我为我的项目做了这个曾经
var frmNewForm = new Form1();
var newThread = new System.Threading.Thread(frmNewFormThread);
newThread.SetApartmentState(System.Threading.ApartmentState.STA);
newThread.Start();
并添加遵循方法。你的newThread.Start会调用这个方法。
public void frmNewFormThread()
{
Application.Run(frmNewForm);
}
这是如何在单独的线程上运行'Form'的问题的实际答案。 – Sebastian 2013-09-29 11:30:47
- 1. 在单独线程中的MFC窗体
- 2. 在单独的线程中运行VCL
- 3. 运行在单独的线程
- 4. 在单独线程上运行ALAssetLibrary块
- 5. 将每个子窗体作为MDI容器中的单独线程运行
- 6. BeginInvoke()是否运行单独的线程?
- 7. 单独线程中的多个表单
- 8. 在单独的窗口运行脚本
- 9. jBPM - 在单独的线程中运行进程
- 10. 在Qt中运行单独的进程或线程
- 11. 由一个单独的线程在窗体上绘制
- 12. 从单独的线程在窗体上绘制图像
- 13. 如何使Office 2013窗口在单独的进程中运行
- 14. Task.Continuewith中的新任务(在单独的线程上运行)
- 15. 在单独的线程中运行SimpleXMLRPCServer并关闭
- 16. Google Analytics(分析)是否在单独的线程中运行?
- 17. 如何在单独的线程中运行计时器?
- 18. Kivy popup在单独的线程中运行
- 19. 在单独的线程中运行Web服务请求
- 20. PyGtk:在单独的线程中运行gtk.main()循环
- 21. 在单独的线程中运行成员函数
- 22. 触发在单独线程中运行的方法
- 23. SQL触发器是否在单独的线程中运行?
- 24. EF嵌套查询是否在单独的线程中运行?
- 25. MediaPlayer应该在单独的线程中运行吗?
- 26. 如何让一段代码在单独的线程中运行?
- 27. GTK +接口应该在单独的线程中运行吗?
- 28. CallBatchTasks(来自ORMLite)是否在单独的线程中运行?
- 29. 在一个单独的线程中运行JavaFX控制器
- 30. Swift CoreBluetooth:CentralManager是否应该在单独的线程中运行?
改为举起一个事件。 – 2010-10-21 19:24:31
你有答案吗? – franklins 2010-10-27 08:33:17