将Task实例传递给任务的委托

时间:2011-12-20 11:49:54

标签: c# callback task task-parallel-library

我有一个长时间运行的Task,它使用回调来递增地提供数据(而不是最后一个ContinueWith()回调)。

我希望能够在此回调中传递Task对象以进行任务识别(使用Task.CurrentId)

但是,我无法弄清楚如何将Task对象传递给任务委托。似乎没有重载来执行此操作,并且我无法使用闭包来执行此操作,因为此时未定义任务对象。

例如

public Task StartDoingSomeStuff(CallbackDelegate callback)
{
    Task task = Task.Factory.StartNew(() =>
    {
         while(whatever)
         {
             var results = DoSomeStuff();
             callback(results, task); //CS0165. How do I get hold of the task?
         }
    });

    return task;
}

给出:

  

错误CS0165:使用未分配的局部变量'task'

3 个答案:

答案 0 :(得分:5)

拆分声明变量并将任务分配给两个语句。确保在分配任务之前不使用变量:

public Task StartDoingSomeStuff(CallbackDelegate callback)
{
    var gate = new object();
    lock (gate)
    {
        Task task = null;
        task = Task.Factory.StartNew(() =>
        {
            lock (gate)
            {
                while (whatever)
                {
                    var results = DoSomeStuff();
                    callback(results, task);
                }
            }
        });
        return task;
    }
}

答案 1 :(得分:1)

另一种解决方案是创建任务键和将键映射到任务的字典,然后将键作为状态传递给任务操作:

var taskMap = new Dictionary<object, Task>();
var taskKey = new object();
taskMap.Add(taskKey, Task.Factory.StartNew(key => { callback(results, key); }, taskKey));

当然,您必须从密钥中查找任务,这可能适合您的情况,也可能不适合。

答案 2 :(得分:0)

这应该有效,尽管这是不好的做法:

public Task StartDoingSomeStuff(CallbackDelegate callback)
{
    Task task = null;

    task = Task.Factory.StartNew(() =>
    {
         while(whatever)
         {
             var results = DoSomeStuff();
             callback(results, task); //CS0165. How do I get hold of the task?
         }
    });

    return task;
}