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

C# 通过同步运行任务防止死锁-Windows服务,c#,task,C#,Task,我了解到,有时直接调用任务会导致主线程死锁 以下是我的异步方法: public async Task<List<JobsWithSchedules>> fillJobsAsync() { IOlapJobAccess jobAccess = new OlapJobAccess(_proxy, CentralPointPath); List<OlapJob> jobs = await jobAccess.GetAllJobsAsync();

我了解到,有时直接调用
任务会导致主线程死锁

以下是我的异步方法:

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;
}
公共异步任务fillJobsAsync()
{
IOlapJobAccess jobAccess=新的OlapJobAccess(_代理,CentralPointPath);
列出作业=等待作业访问。GetAllJobsAsync();
列表quartzJobs=null;
如果(作业!=null)
{
quartzJobs=填充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
        {
            //...
        }
    });
}
public void syncFoo1()
{
var fillJobsTask=fillJobsAsync()。ContinueWith((任务)=>
{
if(task.Status==TaskStatus.RanToCompletion&&task.Result!=null)
{
列出quartzJobs=task.Result;
//...
}
其他的
{
//...
}
});
fillJobsTask.Wait();
}
公共void syncFoo2()
{
Task.Run(()=>fillJobsAsync()).ContinueWith((Task)=>
{
if(task.Status==TaskStatus.RanToCompletion&&task.Result!=null)
{
列出quartzJobs=task.Result;
//...
}
其他的
{
//...
}
});
}
我想知道在
syncFoo()
中同步运行
async
方法而不造成死锁的更好解决方案。我应该像在
syncFoo2()
中那样做吗


PS:
syncFoo()
是从windows服务
onStart()
onStop()
中调用的,因为它位于windows服务中,所以任务永远不应按建议同步运行。我将其更改为异步,并且工作正常。

为什么要同步调用异步方法?为什么不公开同步重载?fillJobsAsync调用wcf服务,如果它是wcf服务,它也有同步端点。@billybob:通常不希望从Win32 service
OnStart
调用同步方法,尤其是在进行网络I/O时,因为这会导致服务超时。为什么不异步调用它并将任务保存在变量中?@billybob:Win32服务不应该这样工作
OnStart
需要立即返回。如果您想启动一个线程或其他东西,请执行
任务。运行