任务<>不包含'GetAwaiter'的定义

时间:2012-08-07 20:41:46

标签: c# wcf silverlight-5.0 async-ctp

客户端

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应用程序消耗 ASP.net 4应用程序中托管的游戏 WCF 4服务使用ChannelFactory技术通过共享可移植库.NET4 / SL5 包含 iGame 界面与异步CTP

图表
ASP.NET &lt; = 类库(游戏)&lt; = 可移植库(iGame) =&gt; Silverlight


编辑2:

  • 我的SL5客户端中添加了Microsoft.CompilerServices.AsyncTargetingPack.Silverlight5.dll
  • 使用System。线程。任务;

13 个答案:

答案 0 :(得分:86)

我在我的一个项目中遇到过这个问题,我发现我已将项目.net版本设置为4.0,并且仅在病房.net 4.5中支持异步任务。

我只是将我的项目设置更改为使用.net 4.5或更高版本,但它确实有效。

答案 1 :(得分:33)

您必须安装Microsoft.Bcl.Async NuGet包才能在.NET 4.5之前的版本中使用async/await构造(例如Silverlight 4.0 +)

为了清楚起见 - 以前这个包被称为Microsoft.CompilerServices.AsyncTargetingPack,而一些旧的tutorials仍然引用它。

查看来自Immo Landwerth的信息here

答案 2 :(得分:18)

在执行linq查询的方法中遇到过这种情况。

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

需要使用.FirstOrDefaultAsync()代替。 N00b错误。

答案 3 :(得分:15)

GetAwaiter()使用的

await是作为Async CTP中的扩展方法实现的。我不确定你到底在用什么(在你的问题中你提到了Async 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
}

答案 4 :(得分:3)

您仍然可以使用框架4.0,但是必须为类添加getawaiter

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

答案 5 :(得分:2)

确保您的.NET 4.5或更高版本

答案 6 :(得分:1)

我遇到了这个问题因为我正在调用方法

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})

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

我对myStaticMethod的呼叫正确路由

答案 7 :(得分:1)

就我而言,只需添加=IF(OR(LEFT(SUBSTITUTE(A1," ",""),1)=" ",RIGHT(SUBSTITUTE(A1," ",""),1)=" "),TRUE,FALSE) 即可解决问题。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

出现问题是因为我正在使用的应用程序和我添加到我的应用程序中的dll都具有不同的版本。

添加此软件包- 安装软件包Microsoft.Bcl.Async-版本1.0.168

添加此程序包异步代码也将在4.0版中兼容,因为异步仅适用于版本大于或等于4.5的应用程序

答案 10 :(得分:0)

我遇到了同样的问题,我必须从方法中删除 async 关键字,并从调用方法中删除 await 关键字才能使用 getawaiter() 没有任何错误。

答案 11 :(得分:-1)

以防万一,错误消息:

'不包含'GetAwaiter'等的定义。

如果在这样的变量之前未正确地放置等待,也会发生

enter image description here

代替:

RtfAsTextLines = await OpenNoUserInterface(FilePath);

答案 12 :(得分:-1)

如果您正在编写 Visual Studio 扩展 (VSIX),请确保您有 Microsoft.VisualStudio.Threading 的 using 语句,如下所示:

using Microsoft.VisualStudio.Threading;