如何在主线程中保留每个异步进程

时间:2014-01-03 17:25:05

标签: c# multithreading asynchronous httprequest windows-phone-7.1

我需要从我的wp7应用程序发出一些网页请求, 比如从服务器获取db版本并将其与本地db版本进行比较,然后在需要时更新db以及更多内容。

我想在启动屏幕时使用某种动画,用户需要等待它,因为这些数据对应用程序至关重要。当所有内容都被检查时,应用程序的主要菜单将被启用。

我想在主线程中保留此请求。一个请求 - >得到回应 - >第二个请求 - >得到回应......我发现只有一种方法可以使用等待 - 任务。我在问其他方法/方法。

的每一种方法
HttpWebRequest

WebClient

使用AsyncCallback所以我可以说我不得不这样做。

如何让我进程等待AsyncCallback的结果,然后继续使用下一个方法?

另外我想向用户提供反馈,如果他需要检查与互联网的连接,如果他的应用程序现在正在更新.....并且从异步方法这是不可能的,因为据了解我们无法处理来自后台踏板的UI

这里是我提出db版本的代码的一部分:

  public WelcomePage()
    {
        InitializeComponent();

        CheckingVersionOFDB();
    }

    private void CheckingVersionOFDB()
    {
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("here my site");

        request.BeginGetResponse(asynchronous_method, request);
    }

    private void asynchronous_method(IAsyncResult ar)
    {


        HttpWebRequest request = (HttpWebRequest)ar.AsyncState;

        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);

        DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(List<versionContent>));

        Stream responseStream = response.GetResponseStream();

       List< versionContent> serverVer = (List<versionContent>)deserializer.ReadObject(responseStream);

       if (version > Convert.ToInt32((serverVer.ElementAt(0)).dbversion))
       {


       }
       else 
       {

       }

    }

你提出的每一条建议对我来说都是无价的

1 个答案:

答案 0 :(得分:2)

  

[{1]}的每种方法都使用WebClient

这是错误的。只需使用名称中AsyncCallback的{​​{1}}方法,即:

  • DownloadFileTaskAsync
  • DownloadStringTaskAsync
  • DownloadDataTaskAsync

然后你可以WebClient完成这些任务。

如果您正在使用其他类型的实际上没有返回Task的异步方法版本,您可以使用await从该异步生成任务方法。

如果异步方法与Task不兼容,要么因为它触发事件,进行回调,要么只是在你希望如何定义任务的语义方面略有不同,你可以使用一个Task.FromAsync手动生成FromAsync给定任何其他异步方法。只需创建TCS并根据其他异步方法提供的任何机制设置结果/异常/取消。