下面的代码运行正常。我想知道这是否真的正确?
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
Parallel.ForEach(openFileDialog.FileNames, currentFile =>
{
try
{
StreamReader FileReader = new StreamReader(currentFile);
do
{
URLtextBox.Invoke(new MethodInvoker(delegate
{
URLtextBox.Text += SelectURLfromString(FileReader.ReadLine());
}));
}
while (FileReader.Peek() != -1);
FileReader.Close();
}
catch (System.Security.SecurityException ex)
{
...
}
catch (Exception ex)
{
...
}
});
}
否则,我将收到“跨线程操作无效。控件'URLtextBox'从另一个线程访问”或卡住的应用程序的消息。
最佳答案
该代码是正确的-您需要使用Invoke
从GUI线程外部刷新控件。但是,您也将在GUI线程中使用SelectURLfromString(FileReader.ReadLine());
方法,应将其替换为
string url = SelectURLfromString(FileReader.ReadLine());
URLtextBox.Invoke(new MethodInvoker(delegate
{
URLtextBox.Text += url;
}));
最大限度地减少GUI线程中的工作。
关于c# - C#4.0从Parallel.ForEach中访问表单控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4475795/