通过 运行 同步任务防止死锁 - 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 建议的那样 运行 同步。我将其更改为异步并且工作正常。