Задача не содержит определения для 'GetAwaiter'

клиент

iGame Channel = new ChannelFactory<iGame> ( new BasicHttpBinding ( BasicHttpSecurityMode . None ) , new EndpointAddress ( new Uri ( "http://localhost:58597/Game.svc" ) ) ) . CreateChannel ( );

public Task<SerializableDynamicObject> Client ( SerializableDynamicObject Packet )
{
    return Task<SerializableDynamicObject> . Factory . FromAsync ( Channel . BeginConnection , Channel . EndConnection , Packet , null );
}

контракт

    [OperationContract ( AsyncPattern = true )]
    IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State );

    SerializableDynamicObject EndConnection ( IAsyncResult Result );

сервис

public IAsyncResult BeginConnection ( SerializableDynamicObject Message , AsyncCallback Callback , object State )
{
    dynamic Request = Message;
    dynamic Response = new SerializableDynamicObject ( );
    if ( Request . Operation = "test" )
    {
        Response . Status = true;
    }
    Response . Status = false;

    return new CompletedAsyncResult<SerializableDynamicObject> ( Response );
}

public SerializableDynamicObject EndConnection ( IAsyncResult Result )
{
    return ( Result as CompletedAsyncResult<SerializableDynamicObject> ) . Data;
}

выставляя обслуживание от клиента Silverlight

private async void myButton ( object sender , RoutedEventArgs e )
{
    dynamic Request = new SerializableDynamicObject ( );
    Request . Operation = "test";

    var task = Client ( Request );
    var result = await task;  // <------------------------------ Exception
}

исключение

Task<SerializableDynamicObject > does not contain a definition for 'GetAwaiter'

что'ы не так ?


Edit 1:

коротко

Visual studio 2012 RC Приложение Silverlight 5 потребляет - игры служба WCF 4 состоялась в ASP.net 4 Применение С техникой ChannelFactory через Shared Портативная Библиотека .NET4 / SL5 содержит iGame интерфейс асинхронный CTP

график :
ASP.NET Библиотека Классов ( Игра ) портативная библиотека (iGame ) => Silverlight


редактирование 2 :

  • Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll добавляется в мой клиент SL5
  • использование системы . Нарезка резьбы. Задачи;

7 ответов


GetAwaiter(), который используется await, реализуется как метод расширения в асинхронном CTP. Я не уверен, что именно вы используете (вы упоминаете как асинхронный CTP, так и VS 2012 RC в своем вопросе), но возможно, что пакет асинхронного таргетинга использует ту же технику.

проблема в том, что методы расширения не работают с dynamic. Что вы можете сделать, это указать, что вы работаете с Task, что означает, что метод расширения будет работать, а затем вернуться к dynamic:
private async void MyButtonClick(object sender, RoutedEventArgs e)
{
    dynamic request = new SerializableDynamicObject();
    request.Operation = "test";

    Task<SerializableDynamicObject> task = Client(request);
    dynamic result = await task;

    // use result here
}

или с Client() метод на самом деле не динамический, вы можете назвать его с SerializableDynamicObject, а не dynamic, и поэтому ограничьте использование dynamic как можно:

private async void MyButtonClick(object sender, RoutedEventArgs e)
{
    var request = new SerializableDynamicObject();
    dynamic dynamicRequest = request;
    dynamicRequest.Operation = "test";

    var task = Client(request);
    dynamic result = await task;

    // use result here
}

у меня была эта проблема в одном из моих проектов, где я обнаружил, что я установил свои проекты .net версии до 4.0 и асинхронные задачи поддерживаются только в .net 4.5 в палатах.

Я просто изменил настройки проекта, чтобы использовать .net 4.5 или выше, и это сработало.


вы должны установить Microsoft.Bcl.Async NuGet пакет, чтобы иметь возможность использовать async/await конструкции в pre-.NET 4.5 версии (например, Silverlight 4.0+)

просто для ясности - этот пакет назывался Microsoft.CompilerServices.AsyncTargetingPack и уроки все еще ссылаются на него.

посмотреть здесь для информации от Immo Landwerth.


просто испытал это в методе, который выполняет запрос linq.

public async Task<Foo> GetSomething()
{
    return await (from foo in Foos
                  select foo).FirstOrDefault();
}

нужно использовать .FirstOrDefaultAsync() вместо. Что n00b ошибку.


у меня была эта проблема, потому что я вызывал метод

await myClass.myStaticMethod(myString);

но я устанавливал myString с

var myString = String.Format({some dynamic-type values})

что привело к dynamic тип, а не string, таким образом, когда я пытался ждать на myClass.myStaticMethod(myString) компилятор думал, что я хотел позвонить myClass.myStaticMethod(dynamic myString). Это скомпилировано отлично, потому что, опять же, в динамическом контексте все хорошо, пока он не взорвется во время выполнения, что и произошло, потому что нет реализации динамической версии myStaticMethod, и это сообщение об ошибке не помогло вообще, и тот факт,что Intellisense приведет меня к правильному определению, тоже не помог.
хитрая!

однако, заставляя тип результата строкой, например:

var myString = String.Format({some dynamic-type values})

to

string myString = String.Format({some dynamic-type values})

мой вызов myStaticMethod маршрутизируется должным образом


public async Task<model> GetSomething(int id)
{
    return await context.model.FindAsync(id);
}

вы все еще можете использовать framework 4.0, но вы должны включить getawaiter для классов:

MethodName(parameters).ConfigureAwait(false).GetAwaiter().GetResult();