在单独的线程中运行Windows窗体

时间:2010-10-21 18:49:57

标签: .net winforms multithreading

我正在处理在表单中运行控件,但表单本身对我没有任何价值。我基本上希望表单运行一个任务并返回一个值,但是为了那个我想使用类似AutoResetEvent的东西只有在它完成时从函数调用返回,这显然会阻止表单线程并使其无法实现完成任务。

4 个答案:

答案 0 :(得分:9)

我为我的项目做了一次

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 :(得分:2)

为什么要在表单中运行任务?

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

通常,您可以通过标准方式从工作线程获取数据。 Worker将数据存储在线程安全数据结构中,然后将事件发送到主线程,表明数据可用。

答案 2 :(得分:2)

我脑子里有两个想法:

  1. 运行委托方法

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

    ......完成任务

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

  2. 单独的帖子

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

    编辑:或工人喜欢建议我的前任

答案 3 :(得分: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();
}

编辑:当然,你想要处理表格,并在完成后取消该事件等。