C# 任务同步

C# Task Syncing

 private void checkProxies()
        {
            foreach(string x in proxyList)
            {
                Task<bool> task = CheckProxy.CheckProxyNonBlocking(x);
                Application.DoEvents();
                task.ContinueWith((t) =>
                {
                    if (!t.Result)
                        Application.DoEvents();
                    else
                    {
                        this.Invoke((MethodInvoker)delegate
                        {
                            validTextBox.Text += x + "\n";
                        });
                    }
                });
            }
        }

我正在尝试构建一个具有多线程设计的代理检查器,proxyList 是 'string[]'.

类型的变量

我的问题是,如果检查需要很多时间,我传递给函数 checkProxyNonBlocking 的 x 是否与我在继续处理的 x 相同?

如果您使用的是 C# 5(或更高版本)和 foreach 循环,那么它应该按您期望的方式工作,并且 validTextBox.Text += x + "\n" 将具有正确的 x 值那个循环迭代。但是,如果您使用的是 C# 4 或 for 循环,那么您将得到不一致的结果,其中 x 可能(取决于时间)具有来自稍后循环迭代的值。

如需完整说明,请阅读 Access to foreach variable in closure warning and Closing over the loop variable considered harmful