Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在主线程中保持每个异步进程_C#_Multithreading_Asynchronous_Httprequest_Windows Phone 7.1 - Fatal编程技术网

C# 如何在主线程中保持每个异步进程

C# 如何在主线程中保持每个异步进程,c#,multithreading,asynchronous,httprequest,windows-phone-7.1,C#,Multithreading,Asynchronous,Httprequest,Windows Phone 7.1,我需要从我的wp7应用程序发出一些web请求, 比如从服务器上获取数据库的版本,并将其与本地数据库版本进行比较,然后在需要时更新数据库 我想在启动屏幕时用一些动画,用户需要等待,因为这些数据对应用程序至关重要。当所有的东西都被检查时,应用程序的主菜单将被午餐 我想将这些请求保留在主线程中。一个请求->获取响应->第二个请求->获取响应。。。我发现唯一的方法就是使用wait-task。我在问其他的方法 每种方法 HttpWebRequest 或 使用AsyncCallback,这样我就可以说我是

我需要从我的wp7应用程序发出一些web请求, 比如从服务器上获取数据库的版本,并将其与本地数据库版本进行比较,然后在需要时更新数据库

我想在启动屏幕时用一些动画,用户需要等待,因为这些数据对应用程序至关重要。当所有的东西都被检查时,应用程序的主菜单将被午餐

我想将这些请求保留在主线程中。一个请求->获取响应->第二个请求->获取响应。。。我发现唯一的方法就是使用wait-task。我在问其他的方法

每种方法

HttpWebRequest

使用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 
       {

       }

    }
你的每一个建议对我来说都是无价的,提前谢谢

[…]WebClient的每个方法都使用AsyncCallback

这是错误的。只需使用名称中包含Task的WebClient方法,即:

下载FileTaskAsync 下载StringTaskAsync 下载DataTaskAsync 然后,您可以等待这些任务中的每一项

如果您使用的其他类型确实没有返回任务的异步方法版本,则可以使用Task.fromsync从该异步方法生成任务


如果异步方法与FromAsync不兼容,或者是因为它触发事件、接受回调,或者只是因为您希望如何定义任务的语义存在一些细微的差异,那么您可以使用TaskCompletionSource在给定任何其他异步方法的情况下手动生成任务。只需创建TCS,并根据其他异步方法提供的任何机制设置结果/异常/取消。

我正在询问其他方法/方法。为什么?您可以使用SynchronizationContext、TaskScheduler、AsyncOperationManager或Dispatcher,但这些都是低于标准的方法。async/await绝对比任何其他方法更简单、更干净、更安全、更易于维护
  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 
       {

       }

    }