通过 运行 同步任务防止死锁 - Windows 服务
Prevent deadlock by running a Task synchronously - Windows Service
我读到有时直接调用 Task
会导致主线程死锁。
这是我的异步方法:
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:从 windows 服务 onStart()
和 onStop()
.
调用 syncFoo()
因为它在 Windows 服务中,所以任务永远不会像 Stephen 建议的那样 运行 同步。我将其更改为异步并且工作正常。
我读到有时直接调用 Task
会导致主线程死锁。
这是我的异步方法:
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:从 windows 服务 onStart()
和 onStop()
.
syncFoo()
因为它在 Windows 服务中,所以任务永远不会像 Stephen 建议的那样 运行 同步。我将其更改为异步并且工作正常。