2017-09-25 152 views
0

試圖傳遞函數,而不是lambda表達式創建任務終於混了,爲什麼行:沒有拉姆達

int t2 = await Task.Run(()=>Allocate2()); 

不會引發錯誤。此lambda表達式()=>Allocate2()不返回Task。爲什麼沒有錯誤?

如何在沒有lambda表達式的情況下創建任務Allocate

static async void Example() 
    { 

     int t = await Task.Run(Allocate); 
     int t2 = await Task.Run(()=>Allocate2()); 
     Console.WriteLine("Compute: " + t); 
    } 


static Task<int> Allocate() 
    { 
    return 1; 
    } 


static int Allocate2() 
    { 
    return 1; 
    } 
+3

['Task.Run'](https://msdn.microsoft.com/en-us/library/hh195051(v = vs.110).aspx)return'Task'。這個任務在裏面做的是另一個故事(參見重載)。 – Sinatr

+0

運行這個我得到這個錯誤'不能隱式地將類型'int'轉換爲'System.Threading.Tasks.Task ''因爲你的返回類型不匹配。但是你想要達到什麼目標呢? –

+0

我試圖在不使用lambda表達式的情況下運行任務 – vico

回答

3

Task.Run()要你一個無參數ActionFunc傳遞給它。

可以將lambda指定給ActionFunc(如適用),這就是爲什麼用lambda函數調用Task.Run()適合您的原因。

如果你不想使用lambda,你必須明確地創建一個ActionFunc,傳遞你想打電話到ActionFunc的構造函數的方法。

下面演示:

static void Main() 
{ 
    var task = Task.Run(new Action(MyMethod)); 
} 

static void MyMethod() 
{ 
    Console.WriteLine("MyMethod()"); 
} 

OR:

static void Main() 
{ 
    var task = Task.Run(new Func<int>(MyMethod)); 
} 

static int MyMethod() 
{ 
    Console.WriteLine("MyMethod()"); 
    return 42; 
} 

注意,如果該方法需要一個或多個參數,這並不工作。在這種情況下,你必須使用lambda。

+0

您也可以執行顯式強制轉換來替代'new' ING。 –

+0

如何在這種情況下使用顯式強制轉換? – vico

+0

@vico你可以像這樣施放它:'var task = Task.Run((Func )MyMethod);' - 但我並不認爲這是一種改進。它實際上結束了或多或少相同的生成的代碼。 (請參閱[這裏](https://stackoverflow.com/questions/24705925/cast-to-func-vs-new-func)獲取更多信息) –