如何从位于单独类中的异步方法接收值?

时间:2011-10-13 17:35:58

标签: c# .net silverlight asynchronous httpwebrequest

我正在开发一个应用程序,该应用程序使用HttpWebRequest类生成大量请求以从Web返回数据。现在,我的应用程序在我的应用程序的多个部分中进行几乎相同这变成了一个问题因为我复制了很多代码。

理想的解决方案是封装在其自己的类中调用Web的逻辑,以便更新变得轻而易举,并且可以在整个应用程序中重用它。我只是不确定如何在单独的类中进行异步调用并将值返回到我的主代码后面,以便我可以使用数据更新UI。

有人可以就如何实现这一目标向我提供一些指导吗?我知道这必须是可能的,因为开发人员在遵循MVVM模式时一直都在这样做。

我正在使用Silverlight / C#。

2 个答案:

答案 0 :(得分:1)

由于您的网络下载代码实际上是您的业务逻辑,我肯定会按照您的计划将其封装在自己的类中。然后,您应该使用事件来通知UI状态更改。

例如,您的“WebRequestManager”实例可以封装所有线程处理,并将引发事件以允许UI进行相应的响应。您可以在TaskCompleted上提出一个事件,也可以每隔一段时间提出一个事件,以提供AsyncProgressChanged等观看反馈。

注意:通过约定,我倾向于为可能从原始调用名称为“Async”的线程以外的线程调用任何事件的前缀,以便UI处理程序知道加入回到UI线程。

答案 1 :(得分:1)

我们在Silverlight应用程序中有这样的代码,用于WCF数据服务。你可以为你的网络请求做类似的事情:

这是一些示例代码(未经测试)(请注意,我实际上并没有编写任何执行Web请求的代码,但是异步模式可能类似于我在Silverlight中完成的其他内容):

public class WebRequesterHelper
{
  Action _callback;

  public void MakeWebRequest(object whateverYouNeedForTheWebRequest, Action callback)
  {
    _callback = callback;

    //Make your async web request here, passing the helper object's callback.

    IAsyncResult result = yourWebRequestObject.BeginGetResponse(new AsyncResultCallback(WebRequestCallback), yourRequestState);
  }

  public void WebRequestCallback(IAsyncResult result)
  {
    //Do whatever you need to do as a result of the web request, then call the callback.
    if (_callback != null) callback();
  }
}

在您想要发出网络请求的代码中:

var helper = new WebRequestHelper();
//Setup the web request

object request = SetUpYourWebRequest();

helper.MakeWebRequest(request, OnWebRequestCompleted);

你的助手回调:

public void OnWebRequestCompleted()
{
  //Web request is finished, what do I want to do?
}

请注意,您可能希望回调(传递给WebRequestHelper对象)接受参数,并且可以从Web请求回调函数(在WebRequestHelper对象中)中传回信息。