我有一个长时间运行的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'
答案 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;
}