【问题标题】:WCF Async CTP SilverlightWCF 异步 CTP Silverlight
【发布时间】:2012-08-05 17:50:06
【问题描述】:

简单地说,

Visual Studio 2012 RC Silverlight 5 应用程序 使用 游戏 WCF 4 服务 托管在 ASP.net 4 应用程序通过共享 Portable Library .NET4/SL5 使用 ChannelFactory 技术包含带有 Async CTP

iGame 接口

图表:
ASP.NET 类库(游戏) 可移植库(iGame)=> Silverlight

便携式图书馆

[ServiceContract]
public interface iGame
{
    [OperationContract]
    Task<bool> Request ( string Key );
}

类库

[ServiceBehavior ( InstanceContextMode = InstanceContextMode . Single , ConcurrencyMode = ConcurrencyMode . Multiple , UseSynchronizationContext = true )]
public class Game : iGame
{
    public async Task<bool> Request ( string Key )
    {
        return await Task . Factory . StartNew ( ( ) => true );
    }
}

银光

    private async void myButton_Click ( object sender , RoutedEventArgs e )
    {
        if ( await Messenger . Instance . Client . Request ( XXX . Text ) ) // Exception
            NavigationService . Navigate ( new Uri ( "/Views/YYY.xaml" , UriKind . Relative ) );
    }
  • Messenger 是一个单例类,通过 ChannelFactory 启动和存储我的客户端代理。

System.InvalidOperationException: The contract 'iGame' contains synchronous operations, which are not supported in Silverlight. Split the operations into "Begin" and "End" parts and set the AsyncPattern property on the OperationContractAttribute to 'true'. Note that you do not have to make the same change on the server.
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__0(Object state)

怎么了? O_o

【问题讨论】:

  • 是的,我的所有解决方案程序集都安装了异步 CTP,也没有内部异常:(

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


【解决方案1】:

在您的客户端,您的iGame 代理是同步的,而您在它周围使用fake-asynchronous wrappers假装它是异步的。

您需要一个异步代理。你可以通过让 VS2012RC 重新生成代理来做到这一点,或者你可以use TaskWsdlImportExtension。我不确定这两种解决方案是否适用于便携式库。

【讨论】:

  • 不,让我们假设异步技术为 TAP、EAP、ARM。 TaskWsdkImportExtension 将创建 APM 和 TAP 而不是 APM 和 EAP。但我最初使用的是 TAP
  • 根据您发布的代码,您的Game 类继承自iGame,并使用StartNew 将同步调用视为异步调用。如果您的代码与您发布的不同,请发布您正在使用的实际代码。
  • 好的,那我们一步一步来。你如何使用Task&lt;bool&gt; 作为 WCF 4 的返回类型,因为async support won't be added until WCF 4.5
  • 我一直假设您有一个正常工作的 .NET 服务器/客户端并正在添加 Silverlight 支持。如果您现在同时编写客户端和服务器,您可能想阅读Async WCF Today and Tomorrow
  • “支持”是社区技术预览的一个强有力的术语。在 VS2012 Dev Preview 发布之前,它得到了很好的支持——从那时起,异步团队一直专注于实际投入生产的异步代码,而不是在 VS2010+AsyncCTP 上工作。我预计在 VS2012 RTM 之后不久,异步 CTP 将被删除。这将为您提供async 代码的两个选项(.NET 4.5 和 .NET 4.0 的 Async Targeting Pack),这两个选项都需要 VS2012。所以我确实希望他们放弃对 VS2010 的 async 支持,但您将能够使用 VS2012 为 .NET 4.0 做 async
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2012-11-15
  • 2011-12-10
  • 2011-09-20
  • 2011-08-19
  • 2011-10-20
相关资源
最近更新 更多