通过同步运行任务来防止死锁 - Windows服务

时间:2015-07-21 15:47:23

标签: c# task

我读到有时直接调用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
        {
            //...
        }
    });
}

我想知道哪个是更好的解决方案,可以在async中同步运行syncFoo()方法而不会导致死锁。我应该像在syncFoo2()中那样做吗?

PS:syncFoo()来自Windows服务onStart()onStop()

1 个答案:

答案 0 :(得分:2)

由于它在Windows服务中,因此任务不应该像Stephen建议的那样同步运行。我将其更改为异步并且工作正常。