我有以下方法:
private void GetHistoricalRawDataFromTextFiles(MessageHeader header, HistoricalRawDataFromTextFileSubscriptionDto dto)
{
var computeInstance = GetComputeInstance(dto.SubscriberId, dto.ComputeInstanceId);
var task = computeInstance.GetHistoricalRawDataFromTextFiles(dto, progress => SendProgress(header.Sender, progress));
task.ContinueWith(myTask =>
{
dto.TimeSeries = myTask.Result;
Messenger.SendTo(SubscriberId, header.Sender, MessageType.Reply, MessageTopic.HistoricalRawDataFromTextFiles, dto);
});
}
方法computeInstance.GetHistoricalRawDataFromTextFiles
返回Task<List<string>>
,我的问题是
header
和dto
传递给lambda表达式和任务延续的正确方法。重要的是,在调用外部方法时,在lambda表达式和任务延续中捕获header
和dto
实例值。在上一次调用的任务完成之前,可以再次调用相同的方法。答案 0 :(得分:1)
捕获标头和dto实例值非常重要 在lambda表达式和任务延续时 调用外部方法。
使用lambda表达式时,关闭的是变量,而不是该变量的值。
只要header
和dto
不是每次在进行方法调用之前修改的全局变量,就应该没问题。如果他们是全局变量,那么您需要找到为每个变量创建本地副本的方法。如果它们是引用类型,则需要克隆它们,如果它们是值类型,则需要将它们复制到lambda中的局部变量。
答案 1 :(得分:1)
我认为你的问题归结为:&#34;我的方法线程安全吗?&#34;
我不认为它与你捕获的变量相关。
您的方法似乎无法访问共享/全局源(静态/全局变量或字段)。(否则您需要同步)
即使这个方法被多个线程同时调用,它仍然是线程安全的,每次调用GetHistoricalRawDataFromTextFiles
都会处理一个单独的&#34;领域&#34; - 这是因为每个线程都有自己的堆栈。
因此,无论您是否使用捕获的变量(指的是相同的内存位置) - 您仍然会为每个迭代领域获得唯一的dto
和header
。
我在这里看不到任何相同的共享内存位置问题,因为每次调用(即使是线程化的) - 都有自己的空间。
再次。这是假设你没有使用任何全球状态。