我遇到线程问题。我的代码:
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个表单并单击取消(在主窗体上)时,此对话框表单需要手动关闭。单击取消后关闭此表单是否可行?
答案 0 :(得分:1)
我做了很多。
您需要做的是
自定义事件处理程序非常适合从线程将消息发送回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());