2015-07-21 54 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。我改变它是异步的,它工作正常。