2010-10-21 49 views
1

我正在处理在窗体中运行控件,但窗体本身对我没有任何价值。我基本上希望表单能够运行一个任务并返回一个值,但是为了让我喜欢使用类似于AutoResetEvent的东西,只有在函数调用完成时才从函数调用中返回,这显然会阻塞表单线程并使其不可能完成任务。在单独的线程中运行窗体表单

+0

改为举起一个事件。 – 2010-10-21 19:24:31

+0

你有答案吗? – franklins 2010-10-27 08:33:17

回答

2

我认为最简单的解决方案是,一旦任务完成,只是从形式上引发事件。

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(); 
} 

编辑:当然你要处理的形式,一旦它完成等解开这一事件..

2

你为什么要在窗体中运行任务?

这听起来像是您的UI和程序逻辑紧密集成。这是糟糕的设计。

一般来说,您可以从工作线程获取数据的标准方式。 Worker将数据存储在线程安全的数据结构中,然后向主线程发送一个事件,指示数据可用。

+0

用于网页抓取目的。 – Novikov 2010-10-21 19:22:45

2

我有我的两种念头:

  1. 运行的委托方法

    IAsyncResult ar = del.BeginInvoke(callback, state);

    ...做任务

    EndInvoke(ar); //等待任务结果如果你允许等待

  2. 单独的线程

最好的方法可能是使用单独的线程来完成任务并在此线程中调用委托通知主线程完成工作。

编辑:或像工作者建议我的前任

8

我为我的项目做了这个曾经

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); 
} 
+1

这是如何在单独的线程上运行'Form'的问题的实际答案。 – Sebastian 2013-09-29 11:30:47

相关问题