1. ホーム
  2. c#

[解決済み] Task<> には 'GetAwaiter' の定義がありません。

2022-02-05 08:23:13

質問

依頼者

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'

は間違っているのか?


編集1 :

簡単に説明すると

Visual Studio 2012 RC Silverlight 5 アプリケーション 消費 ゲーム WCF 4 サービス でホストされている ASP.net 4 アプリケーション ChannelFactoryのテクニックを使って、Shared ポータブルライブラリ .NET4/SL5 には iGame とのインターフェースは 非同期CTP

グラフ :
ASP.NET <= クラスライブラリ ( ゲーム ) <= ポータブルライブラリ(iGame) => シルバーライト


編集2 :

  • Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll は、私の SL5 Client に追加されます。
  • を使用しています。スレッディング。タスク;

解決方法は?

GetAwaiter() で使用されている await は、Async CTP では拡張メソッドとして実装されています。質問ではAsync CTPとVS 2012 RCの両方を挙げていますが、Asyncターゲティングパックが同じテクニックを使っている可能性がありますね。

そこで問題となるのは、拡張メソッドが 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
}