2015-07-21 51 views
5

我讀到有時直接調用Task會導致主線程死鎖。通過同步運行任務來防止死鎖 - Windows服務

這裏是我的異步方法:

public async Task<List<JobsWithSchedules>> fillJobsAsync() 
{ 
    IOlapJobAccess jobAccess = new OlapJobAccess(_proxy, CentralPointPath); 
    List<OlapJob> jobs = await jobAccess.GetAllJobsAsync(); 
    List<JobsWithSchedules> quartzJobs = null; 
    if (jobs != null) 
    { 
     quartzJobs = fillQuartzJobs(jobs); 
    } 
    return quartzJobs; 
} 

我嘗試了很多方式來運行的同步功能這個任務。下面是一些例子:

public void syncFoo1() 
{ 
    var fillJobsTask = fillJobsAsync().ContinueWith((task) => 
    { 
     if (task.Status == TaskStatus.RanToCompletion && task.Result != null) 
     { 
      List<JobsWithSchedules> quartzJobs = task.Result; 
      //... 
     } 
     else 
     { 
      //... 
     } 
    }); 
    fillJobsTask.Wait(); 
} 

public void syncFoo2() 
{ 
    Task.Run(() => fillJobsAsync()).ContinueWith((task) => 
    { 
     if (task.Status == TaskStatus.RanToCompletion && task.Result != null) 
     { 
      List<JobsWithSchedules> quartzJobs = task.Result; 
      //... 
     } 
     else 
     { 
      //... 
     } 
    }); 
} 

我想知道這是更好的解決方案,而不會導致死鎖同步在syncFoo()運行async方法。我應該像syncFoo2()那樣做嗎?

PS:syncFoo()從窗口服務onStart()onStop()中調用。

+1

爲什麼你想同步調用一個異步方法?爲什麼不公開同步過載? –

+0

fillJobsAsync調用wcf服務 – billybob

+0

如果它的WCF服務也具有同步端點。 –

回答

2

由於它位於Windows服務中,因此建議不要同步運行任務Stephen。我改變它是異步的,它工作正常。