![](/img/trans.png)
[英]Inconsistent behavior: MVVM RelayCommandWPF with closure capturing local variable
[英]Closure and capturing local variable in a loop
using System;
public class Program
{
public static void Main()
{
IRunnable runnable = new Runnable();
for(int i=0;i<10;i++)
{
RunIt(runnable);
}
}
public static void RunIt(IRunnable runnable)
{
var context = new Context();
context.Id = runnable.RunAsync((id,result)=>{
//context.Id will always match "id" here?
context.Result = result; // can I assume here that this is the same context?
});
}
public interface IRunnable
{
int RunAsync(Action<string,string> successHandler);
}
public class Runnable : IRunnable
{
private Random _random = new Random();
public string RunAsync(Action<string,string> successHandler)
{
var guid = Guid.NewGuid().ToString();
Task.Run(()=>
{
Thread.Sleep(_random.Next(0,1000));
successHandler(guid, "result")
});
return guid;
}
}
public class Context
{
public string Id {get;set;}
public string Result{get;set;}
}
}
在这个例子中,我在循环中运行函数RunIt
。 RunIt
异步启动一个进程,并在完成后分配匿名处理程序。 在同一个函数中,我们有一个上下文变量,它将被匿名 lambda 捕获。 我的问题很简单 - 我可以假设捕获的上下文将始终与结果匹配吗? 我在这里担心的是我运行了 10 次,这意味着 successHandler 将以无序方式调用 10 次。 每个上下文是否有单独的匿名函数版本?
长话短说 - context.Id
总是匹配匿名函数中的 successHandler“id”?
我知道这个问题被否决了,但无论如何我都会回答。 答案是肯定的,每次迭代都会单独捕获Context
变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.