Задача не содержит определения для '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
маршрутизируется должным образом
вы все еще можете использовать framework 4.0, но вы должны включить getawaiter
для классов:
MethodName(parameters).ConfigureAwait(false).GetAwaiter().GetResult();