编写基于异步方法的事件以将值返回给调用者

时间:2013-07-10 00:28:42

标签: c# wcf asynchronous .net-4.5 silverlight-5.0

我正在尝试使用silverlight生成WCF方法(SLSVCUTIL)。我有一个返回字符串的WCF服务。但是,我必须使用具有GetStringValueAsync和GetStringValueCompleted的异步方法。但我的调用者期望一个字符串返回值。如何连接这个模式,以便调用者可以调用该方法,它可以返回一个字符串?

假设我有一个按钮,当它被点击时,它会向用户显示一条消息,即服务器的本地时间。通过GetServerTimeAsync()从WCF服务检索消息。

void ShowServerTime_ButtonClick()
{
   string result = MyServiceHandler.GetServerTime();
}

public class MyServiceHandler
{
   public static string GetServerTime()
   {
       //method to call is WCFService.GetServerTimeAsync()
       //how do I write this so I can return a string value to the caller?
   }
}

1 个答案:

答案 0 :(得分:0)

我认为您需要设置一个Action委托,以便您可以编写MyServiceHandler.GetServerTime(result => ...)。我喜欢这样设置:

void ShowServerTime_ButtonClick()
{
    MyServiceHandler.GetServerTime(result => {
        // do something with "result" here
    });
}

public class MyServiceHandler
{
    // wire up the handler in the constructor
    static MyServiceHandler()
    {
        WCFService.GetServerTimeCompleted += (sender, args) 
        {
            // assume you're going to pass the callback delegate in the User State:
            var handler = args.UserState as Action<string>;
            if (handler != null) handler(args.Result);
        }
    }

    public static string GetServerTime(Action<string> callback)
    {
        // send the callback so that the async handler knows what to do:
        WCFService.GetServerTimeAsync(callback)
    }
}

当然,既然你正在使用.NET 4.5 / Silverlight 5,那么你可以深入研究async/await stuff,这是一个很好的语法糖(如果你是这样的话)。