可以将等待的任务分配给某个动作吗?

时间:2016-06-09 02:22:03

标签: c# asynchronous

我将Action定义为:

Action CurrentDxList;

最初,我用它作为:

private void test()
{
 CurrentDxList = MakeAllDxList;
 CurrentDxList();
}

其中

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();
        }

但是,MakeAllDxList()最好使用async定义:

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();
        }

现在导致以下错误:

  

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

那么可以为行动分配一个等待吗?这是怎么做到的?任何想法都是最受欢迎的。

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

private async void MakeAllDxList()

但是我会失去异步任务的所有优点。

2 个答案:

答案 0 :(得分:4)

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

P.S。别忘了等待CurrentDxList代表

private async Task test()
{
 CurrentDxList = MakeAllDxList;
 await CurrentDxList();
}

您需要更新调用test的人也是异步。

答案 1 :(得分:1)

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

在上面的代码中,“var dx = await”模式称为闭包。如果将断点设置为该语句之后的第一行代码,则会看到dx的值为GetAllDxAsync方法返回的类型。因为该方法被命名为“Getxyz”,暗示它是某种类型的再生物数据。要退出MakeAllDxList方法,需要做两件事1)将Task的返回类型更改为Task<dxType>,其中dxType是变量dx的类型。 2)在var dx行之后,输入“return dx”的声明。

相关问题