2011-03-29 43 views
0

我遇到线程问题。我的代码:从另一个线程关闭对话框

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

现在在解析我:

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个窗体并单击取消(在主窗体上)时,此对话窗体需要手动关闭。点击取消后关闭此表单是否可行?

+0

这是一个Windows窗体或WPF,什么是“问题”异常? – CodingGorilla 2011-03-29 14:05:32

+0

Windows窗体。问题是我不知道如何关闭打开的对话框automaticaly – JanZiolko 2011-03-29 15:10:37

+0

我不确定我是否理解,只需调用Close方法即可。你在问什么? – CodingGorilla 2011-03-29 15:11:51

回答

0

你可能想看看http://msdn.microsoft.com/en-us/library/system.windows.forms.application.openforms.aspx

你可以遍历开开的形式和调用close对那些类型InputForm的

编辑:

下面的评论是正确的这会抛出异常。你实际上需要类似FormToClose.BeginInvoke(delegate()=> FormToClose.Close());

+0

OP的表单是在单独的线程中创建的。如果您尝试从主线程关闭它们,您将收到一个交叉线程或无效操作异常。 – jp2code 2011-03-29 17:37:06

1

我做了很多。

什么你将需要做的是

  • 创建方式与您(MTOE)主线程执行通信
  • 打电话给你的主线程和等待在响应
  • 你的主线程,为您的线索显示您的对话框
  • 设置返回值
  • 信号的线程完成后

自定义事件处理程序非常适合从线程获取消息返回到MTOE。

A ManualResetEvent非常适合您的线程了解MTOE何时完成。

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

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

从您的MTOE中,如果您关闭表单,则可以将所有等待中的对话框标记为取消。

这需要稍微重新设计,但我认为它会给你以后的样子。