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服务也具有同步端点。 –