2016-05-20 79 views
0

我有我歸結爲這樣的代碼片段一個問題:任務<t> .Wait永遠不會返回

var task=new Task<int>(()=>5); 

task.Wait(); 

問題是task.Wait()永遠不會返回。我過去編寫的代碼工作得很好。

我試過到目前爲止:

  • 包裹了整個事情的異步函數和調用Wait上(相同的行爲)
  • 這最初是裹在WaitAll承諾的列表,上調用Wait停滯
  • 打過電話Task.Start,但收到的聲明Task.Start沒有與承諾的風格任務工作異常

那麼,有什麼想法?

編輯:

完整的代碼片段,導致該問題:

static void EfTest() 
{ 
    _start = DateTime.Now; 
    var task = CreateEfTask(); 

    var efTasks= Enumerable.Range(0, 1).Select(i => CreateEfTask()).ToList(); 

    var t= Task.WhenAll(efTasks); 
    t.Wait(); 

    var results = t.Result; 
} 

private static Task<Result> CreateEfTask() 
{ 
    return new Task<List<PricingRule>>(
     () => new global::Entities 
      .Entities() 
      .PricingRules 
      .Where(pr => pr.IsEnabled).ToList()) 
      .ContinueWith(t => new Result 
      { 
       PricingRules = t.Result, 
       TimeSpan = DateTime.Now.Subtract(_start) 
      }); 
} 

Task.Startt.Wait之前拋出一個錯誤說你不能使用中承諾窗框任務開始。

+0

如果我做task.Start();它運行,但它在我等待時已經完成。所以,然後我的預期運行 - 我沒有得到錯誤 – BugFinder

+0

「試圖調用Task.Start,但收到一個異常,聲明Task.Start不適用於承諾風格任務」我們可以看到具體的異常嗎? – spender

回答

2

Task.Wait任務永遠不會結束,因爲它正在等待的任務從未開始。你需要開始

var efTasks= Enumerable.Range(0, 1).Select(i => CreateEfTask()).ToList(); 

foreach(var t in eTasks) { 
    t.Start(); 
} 

var t= Task.WhenAll(efTasks); 
t.Wait(); 

雖然你可能想在CreateEfTask()啓動它:

private static Task<List<PricingRule>> CreateEfTask() 
{ 
    var t = new Task<List<PricingRule>>(
     () => new global::Entities.Entities().PricingRules.Where(pr => pr.IsEnabled).ToList()).ContinueWith(t=>new Result {PricingRules = t.Result,TimeSpan = DateTime.Now.Subtract(_start)}); 
    t.Start(); 
    return t; 
} 

如果這是實體框架,你應該能夠無需構建自己的任務,例如啓動這些異步執行查詢

private static Task<List<PricingRule>> CreateEfTask() { 
    return new global::Entities.Entities().PricingRules.Where(pr => pr.IsEnabled).ToListAsync(); 
} 
+0

在重讀MSDN示例時自己想到了這一點。謝謝 :) – linkerro

2

別的東西是你的應用程序每次

using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var task = new Task<int>(() => 5); 
      task.Start(); 
      task.Wait(); 
     } 
    } 
} 

運行到結束,沒有錯誤的地方錯了。

0

您的代碼沒有啓動任務。在等待之前,您需要在任務上致電Start()

您還可以使用Task.Factory.StartNew方法,它在功能上等同於用構造創建任務,然後啓動它,比如:

var task = Task.Factory.StartNew(() => 5); 

task.Wait() 
相關問題