无法等待';Model.PersonalInfo';

本文关键字:PersonalInfo Model 等待 | 更新日期: 2023-09-27 18:20:34

我在DesignDataService类中有以下方法

public async Task<T> GetData<T>(T dataObject)
{
    var typeName = typeof(T).Name;    
    switch (typeName)
    {
        case "PersonalInfo":
            var person =  new PersonalInfo
                     {
                     FirstName = "Mickey",
                     LastName = "Mouse" ,
                     Adres = new Address{Country="DLRP"} ,
                };
        return await person;
    }   // end Switch
}   // GetData<T>

如何从DataService返回新的PersonalInfo类?

目前我收到错误无法等待"Model.PersonalInfo"

即使我将return语句更改为,也会将等待人员返回为Task错误保持相同的

无法等待';Model.PersonalInfo';

即使此函数返回Task,也不需要使用async关键字。

在这里,您可以简单地使用Task.FromResult

public Task<T> GetData<T>(T dataObject) where T : MyKnownBaseObject
{
    var typeName = typeof(T).Name;    
    switch (typeName)
    {
        case "PersonalInfo":
            var person =  new PersonalInfo
                     {
                     FirstName = "Mickey",
                     LastName = "Mouse" ,
                     Adres = new Address{Country="DLRP"} ,
                };
            return Task.FromResult<T>(person);
            break;
        default:
               return Task.FromResult<T>(default(T));
    }   // end Switch
}   // GetData<T>

这不会将工作委派给另一个线程。如果你有少量的工作不适合parralellism,但你仍然必须强制方法返回一个与其他方法兼容的任务,那么这种技术就可以了。

您将两种东西混合在一起。您用async注释一个方法,以指示编译器您希望能够(在Task中)await异步操作。

另一方面,返回值是Task。您可以将两者混合使用,但在您的情况下(async Task<T>),这意味着您正在返回一个操作的异步承诺,但您也要在方法中等待一个的结果,这肯定不是您想要的。

如果PersonalInfo的创建预计需要很长时间,则需要将对象的创建添加到Task中并等待。

您的方法似乎没有类型限制,因此要返回PersonalInfo,您必须从object转换为T

示例:

    public async Task<T> GetData<T>(T dataObject)
    {
        var typeName = typeof(T).Name;
        switch (typeName)
        {
            case "PersonalInfo":
                return await Task<T>.Factory.StartNew(() =>
                {
                    return (T)(object)new PersonalInfo
                    {
                        FirstName = "Mickey",
                        LastName = "Mouse",
                        Adres = new Address { Country = "DLRP" },
                    };
                });
        }
        return default(T);
    }