如何让主线程在另一个类中完成StreamReader时等待

时间:2013-04-01 11:56:13

标签: windows-phone-7 concurrency webclient iostream

我目前正在开发一个应用程序,但对于wp7开发还是一个新手,我有一个主进程调用另一个使用StreamReader来读取网页内容并分配变量的类。我遇到的问题是主要过程是在分配值之前尝试使用变量。有没有办法让主进程等到StreamReader完成

在主线程中我有:

 locationDetails = new LocationResults();
 locationDetails.getResults(addressDetails);

然后在LocationResults类

public void getResults(String address)
    {
        String addy, tmp;
        if (address[0] == '+')
        {
            tmp = address.Substring(1);
            addy = baseAddress + tmp + "&sensor=false";
        }
        else
            addy = baseAddress + address + "&sensor=false";

        WebClient webClient = new WebClient();
        webClient.OpenReadAsync(new Uri(addy));
        webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);

    }

    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        String tmp;
        var reader = new StreamReader(e.Result);
        tmp = reader.ReadToEnd().ToString();
        results = tmp;
    }

1 个答案:

答案 0 :(得分:0)

自从我使用WP 7和.NET以来已经很长时间了,但我认为以下方法可以提供帮助:

  1. 使用任务并行库执行与主线程异步的整个getResult-Procedure。
  2. 在任务中同步使用WebClient,然后返回读取数据。
  3. 通过http://msdn.microsoft.com/en-us/library/hh194793.aspx指定Continuation操作并传递主线程的TaskScheduler实例,以便进行同步。
  4. 在继续操作中放置影响结果的主线程代码。
  5. 编辑: 我猜代码看起来应该是这样的:

    Task.Factory.StartNew((adr)-> InvokeGetResult(adr as string), addressDetails)
       .ContinueWith((data) -> HandleDataSynchronousToMainThread(data),
          TaskScheduler.Current);
    

    但是又一次:自从我写完最后一个.NET代码以来已经很长时间了......