2016-12-19 2 views
-1

я работаю асинхронный WebService вызова и играть с этой задачей и ждать строительство:Асинхронные задачи и ждут в C#

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

Task and Await Error

Модифицированный скомпилированный код:

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

Я думаю, что самый простой способ - «вернуться в ожидании Factory.FromAsync ...' – RandomStranger

+0

Не нужно ждать задания, если вы просто собираетесь его вернуть. Просто 'return Factory.FromAsync' –

ответ

2

Похоже, что вы вызываете метод 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; 

Я оставил именованные параметры здесь для ясности, но вы должны уметь их удалить, если хотите.

+0

Спасибо за ваше предложение :) – Inoel

+1

' return await t; 'следует заменить на' return t; '. Нет смысла в * ожидании * результата при возврате задачи. В любом случае клиенту придется «ждать». Вы просто теряете процессорное время, создавая дублирующее состояние машины. –

+0

Хороший вопрос. Я обновил ответ, чтобы отразить это. –

Смежные вопросы