下面的代码运行正常。我想知道这是否真的正确?

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/

10-13 06:53