【发布时间】:2010-10-21 18:49:57
【问题描述】:
我正在处理在表单中运行控件,但是表单本身对我没有价值。我本质上希望表单运行任务并返回一个值,但是为此我想使用类似 AutoResetEvent 的东西仅在函数调用完成时才从函数调用返回,这显然会阻塞表单线程并使其不可能以完成任务。
【问题讨论】:
-
你得到答案了吗?
标签: .net winforms multithreading
我正在处理在表单中运行控件,但是表单本身对我没有价值。我本质上希望表单运行任务并返回一个值,但是为此我想使用类似 AutoResetEvent 的东西仅在函数调用完成时才从函数调用返回,这显然会阻塞表单线程并使其不可能以完成任务。
【问题讨论】:
标签: .net winforms multithreading
我为我的项目做过一次
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 问题的实际答案。
我认为最简单的解决方案是在任务完成后从表单中引发一个事件。
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 将数据存储在线程安全的数据结构中,然后向主线程发送一个事件,表明数据可用。
【讨论】:
我有两个想法:
运行委托方法
IAsyncResult ar = del.BeginInvoke(callback, state);
...做任务
EndInvoke(ar); // 如果允许等待则等待任务结果
单独的线程
最好的方法可能是使用单独的线程来完成任务并在这个线程中调用委托来通知主线程工作完成。
edit: or Worker like 建议我的前任
【讨论】: