将数据传递到任务继续

时间:2015-10-04 08:09:58

标签: c# closures task-parallel-library task continuations

我有以下方法:

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>>,我的问题是

  • 这是否是将headerdto传递给lambda表达式和任务延续的正确方法。重要的是,在调用外部方法时,在lambda表达式和任务延续中捕获headerdto实例值。在上一次调用的任务完成之前,可以再次调用相同的方法。

2 个答案:

答案 0 :(得分:1)

  

捕获标头和dto实例值非常重要   在lambda表达式和任务延续时   调用外部方法。

使用lambda表达式时,关闭的是变量,而不是该变量的

只要headerdto不是每次在进行方法调用之前修改的全局变量,就应该没问题。如果他们全局变量,那么您需要找到为每个变量创建本地副本的方法。如果它们是引用类型,则需要克隆它们,如果它们是值类型,则需要将它们复制到lambda中的局部变量。

答案 1 :(得分:1)

我认为你的问题归结为:&#34;我的方法线程安全吗?&#34;

我不认为它与你捕获的变量相关。

您的方法似乎无法访问共享/全局源(静态/全局变量或字段)。(否则您需要同步)

即使这个方法被多个线程同时调用,它仍然是线程安全的,每次调用GetHistoricalRawDataFromTextFiles都会处理一个单独的&#34;领域&#34; - 这是因为每个线程都有自己的堆栈。

因此,无论您是否使用捕获的变量(指的是相同的内存位置) - 您仍然会为每个迭代领域获得唯一的dtoheader

我在这里看不到任何相同的共享内存位置问题,因为每次调用(即使是线程化的) - 都有自己的空间。

再次。这是假设你没有使用任何全球状态。