可以将可等待的任务分配给操作吗?

Ala*_*yne 3 c# asynchronous

我有一个操作定义为:

Action CurrentDxList;
Run Code Online (Sandbox Code Playgroud)

最初,我将其用作:

private void test()
{
 CurrentDxList = MakeAllDxList;
 CurrentDxList();
}
Run Code Online (Sandbox Code Playgroud)

在哪里

private void MakeAllDxList()
        {
            var dx = MedicalClient.GetAllDx((int)Patient.Patient_Recid, Patient.tservice);
            _dxlist = dx.OrderBy(o => o.Cdesc);

            DxList = new ObservableCollection<DiagnosisDetail>(iDxDetail);
            ListCount = DxList.Count();
        }
Run Code Online (Sandbox Code Playgroud)

然而,MakeAllDxList() 最好用异步定义为:

private async Task MakeAllDxList()
        {
            var dx = await MedicalClient.GetAllDxAsync((int)Patient.Patient_Recid, Patient.tservice);
            _dxlist = dx.OrderBy(o => o.Cdesc);

            DxList = new ObservableCollection<DiagnosisDetail>(iDxDetail);
            ListCount = DxList.Count();
        }
Run Code Online (Sandbox Code Playgroud)

现在会导致以下错误:

任务 MakeAllDxList() 的返回类型错误。

那么是否可以为一个动作分配一个可等待的值呢?这是怎么做到的?任何想法都是非常受欢迎的。

当然,我可以将 MakeAllDxList() 的签名更改为

private async void MakeAllDxList()
Run Code Online (Sandbox Code Playgroud)

但这样我就会失去异步任务的所有优点。

Sco*_*ain 5

您需要将 更改Action为 a Func<Task>,这是新的类型定义。

PS 不要忘记等待CurrentDxList代表

private async Task test()
{
 CurrentDxList = MakeAllDxList;
 await CurrentDxList();
}
Run Code Online (Sandbox Code Playgroud)

您还需要将调用者更新test为异步。