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。
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。