0

我在 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 语句更改如下,return await person as Task; 错误保持不变

4

3 回答 3

2

即使此函数返回 a 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>

这不会将工作委托给另一个线程。如果您有少量不适合并行的工作,则此技术有效,但您仍必须强制该方法返回任务以与其他方法兼容。

于 2013-06-30T22:24:53.253 回答
0

你混合了两件事。您注释一个方法async以指示编译器您希望能够进行await异步操作(在任务中)。

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

于 2013-06-30T22:11:25.623 回答
0

如果PersonalInfo预计创建需要很长时间,您将希望将对象的创建添加到任务中并等待。

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

例子:

    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);
    }   
于 2013-06-30T22:17:16.303 回答