2013-04-17 33 views
22

我想使用this Task<> constructor。我似乎无法得到sntax是否有人可以纠正我的代码。如何构建一个任务而不启动它?

另外,我正确的想,如果一个任务是这样构建的,它不是开始?

我想构造我需要:

Task<TResult>(Func<Object, TResult>, Object) 

我的代码示数:

参数1:无法从 '方法组' 转换为 'System.Func<object,int>'

static void Main(string[] args) 
{ 
    var t = new Task<int>(GetIntAsync, "3"); //error is on this line 
    ... 
} 

static async Task<int> GetIntAsync(string callerThreadId) 
{ 
    ... 
    return someInt; 
} 
+0

我很困惑,你的方法已经是'async',你为什么要附上它在另一个' Task'? – svick

+0

:-)来模拟你实际评论过的东西[this](http://stackoverflow.com/questions/16054467/does-task-runsynchronously-work-recursively)线程 –

+0

那么,这样你就会得到一个unsarted'Task',但它与'async'方法返回的'Task'不一样。 – svick

回答

19
var t = new Task<int>(() => GetIntAsync("3").Result); 

或者

var t = new Task<int>((ob) => GetIntAsync((string) ob).Result, "3"); 

要避免使用lambda,你需要写这样一个静态方法:

private static int GetInt(object state) 
{ 
    return GetIntAsync(((string) state)).Result; 
} 

然后:

var t = new Task<int>(GetInt, "3"); 
+0

你不是在使用与我问的不同构造函数吗? –

+0

我更新了答案。 –

+0

第一个构造函数使用闭包来传递参数,第二个构造函数使用状态来传递参数。 –

-1
//creating task 
    var yourTask = Task<int>.Factory.StartNew(() => GetIntAsync("3").Result); 

    //... 

    int result = yourTask.Result; 

UPDATE:

是的,不幸的是它确实启动了任务。上面不是提到使用代码:

//creating task 
    var yourTask = new Task<int>(() => GetIntAsync("3").Result); 

    //... 

    // call task when you want 
    int result = yourTask.Start(); 
+2

这是创建**并启动**。任务。他希望在不启动**的情况下创建它。 – Servy

0

我更喜欢使用Unwrap()代替Task.Result

Task<int> t = new Task<Task<int>>(async (ob) => 
    await GetIntAsync((string)ob), "3").Unwrap(); 
+0

似乎'Task Unwrap()'没有'Task >'上的'Start()'将其变成一个永远无法启动的任务:在Unwrapped()任务上调用'Start()'会抛出一个' InvallidOperationException':“启动可能不会在承诺式任务上调用。”使用'await t'或't.Result'等待无限。 @Sel你能否详细说明你的答案,以及以后如何启动'任务''t'以及如何检索结果。 –

相关问题