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()
中調用。
爲什麼你想同步調用一個異步方法?爲什麼不公開同步過載? –
fillJobsAsync調用wcf服務 – billybob
如果它的WCF服務也具有同步端點。 –