从其他线程关闭对话框

时间:2011-03-29 13:35:26

标签: c# multithreading

我遇到线程问题。我的代码:

Task.Factory.StartNew(() =>
{
    cts  = new CancellationTokenSource();
    var lines = File.ReadLines(Path.Combine(Environment.CurrentDirectory, "urls.txt"));

    try
    {
        var q = from line in lines.AsParallel().WithDegreeOfParallelism(30).WithCancellation(cts.Token)
        let result = Parse(line, cts.Token)
            select new
            {
                res = result
            };

        foreach (var x in q)
        {
            if (x != null)
            {
                Console.WriteLine("{0}", x.res);
            }
        }

    }
    catch (OperationCanceledException ex)
    {
        Console.WriteLine(ex.Message);
    }
});

现在在Parse我有:

public String Parse(String url,CancellationToken ct)
{
    ct.ThrowIfCancellationRequested();
    /* many lines of code */
    InputForm iForm = new InputForm();
    iForm.setPageData(pageData);

    if (iForm.ShowDialog() == DialogResult.OK)
    {
        string userInput = iForm.textBox.Text;
        /* code block */
        return result;
    } else {
        return Parse(newUrl,ct);
    }
}

我正在使用ShowDialog,因为我需要从iForm获取用户输入(此表单有一个计时器,并在60秒后自动关闭)。现在,当我打开大约30个表单并单击取消(在主窗体上)时,此对话框表单需要手动关闭。单击取消后关闭此表单是否可行?

2 个答案:

答案 0 :(得分:1)

我做了很多。

您需要做的是

  • 创建与主要执行线程(MTOE)进行通信的方式
  • 调用主线程并等待回复
  • 在主线程中,显示​​对话框
  • 设置线程的返回值
  • 告知你的线程你已经完成了

自定义事件处理程序非常适合从线程将消息发送回MTOE。

ManualResetEvent有助于您的线程知道MTOE何时完成。

类实例可以在MTOE用来填充一些数据项的事件处理程序中传递,并在完成后传回给线程。

通常,当我创建特殊类时,它包含事件处理程序和ManualResetEvent对象。

在您的MTOE中,如果您关闭表单,则可以将所有等待的对话框发送给取消。

这需要稍微重新设计,但我认为它会给你你想要的东西。

答案 1 :(得分:0)

您可能需要查看http://msdn.microsoft.com/en-us/library/system.windows.forms.application.openforms.aspx

您可以遍历打开的打开表单并在InputForm类型的

上调用close

编辑:

以下评论是正确的,这会引发异常。你实际上需要像FormToClose.BeginInvoke(delegate()=> FormToClose.Close());