【问题标题】:Async Task and await in C#C# 中的异步任务和等待
【发布时间】:2016-12-19 14:33:26
【问题描述】:

我正在处理异步网络服务调用,并且正在玩这个任务并等待构造:

private static async Task<RSAParameters> GetPublicSecretKey(ICoreIdentityService identityChannel)
{
        Object state = null;
        var t = Task<RSAParameters>.Factory.FromAsync(
            identityChannel.BeginGetPublicKey,
            identityChannel.EndGetPublicKey,
                null, state, TaskCreationOptions.None);
        return await t;
}

//Methods definition:
//IAsyncResult BeginGetPublicKey(AsyncCallback callback, object asyncState)
//RSAParameters EndGetPublicKey(IAsyncResult result)

构建我得到的代码方法....的类型参数不能从使用中推断出来。我错过了什么吗?

提前致谢。干杯,inoel

修改后的编译代码:

var t = Task<RSAParameters>.Factory.FromAsync(
    identityChannel.BeginGetPublicKey,
    identityChannel.EndGetPublicKey,
    TaskCreationOptions.None);

【问题讨论】:

  • 我认为最简单的方法是return await Factory.FromAsync...
  • 如果您只是要返回任务,则无需等待任务。就return Factory.FromAsync

标签: c# macos asynchronous xamarin


【解决方案1】:

您似乎以意外的顺序使用参数调用 FromAsync() 方法。

错误消息本身建议显式命名您的参数,因此您的代码看起来类似于以下内容:

var t = Task<RSAParameters>.Factory.FromAsync(
                asyncResult: identityChannel.BegineGetPublicKey,
                endMethod: identityChannel.EndGetPublicKey,
                creationOptions: TaskCreationOptions.None,
                scheduler: state);

或者,您可以更正参数的顺序,这应该可以解决问题。 我能找到的最接近的重载是这样的:

public Task<TResult> FromAsync<TArg1, TArg2>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions);

所以假设你打算使用这个,你的代码需要稍微修改一下,传入 arg1 和 arg2 的类型,然后传入一个额外的参数:

Object state = null;
var t = Task<RSAParameters>.Factory.FromAsync<TArg1, TArg2>(
            beginMethod: identityChannel.BeginGetPublicKey,
            endMethod: identityChannel.EndGetPublicKey,
            arg1: null, // Either arg1, or arg2 is missing
            arg2: null, // from your code
            state: state,
            creationOptions: TaskCreationOptions.None);

return t;

为了清楚起见,我在此处保留了命名参数,但如果您愿意,应该可以删除这些参数。

【讨论】:

  • 感谢您的建议 :)
  • return await t; 应替换为 return t;。当你返回一个任务时,等待结果是没有意义的。无论如何,客户必须await。您只是通过生成重复的状态机来浪费 CPU 时间
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多