Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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#windows phone 8中使用等待功能返回数据?_C#_.net_Windows Phone 8 - Fatal编程技术网

如何在C#windows phone 8中使用等待功能返回数据?

如何在C#windows phone 8中使用等待功能返回数据?,c#,.net,windows-phone-8,C#,.net,Windows Phone 8,我是C#的新手。我 我遇到了一个与C#windows phone 8.0中的异步方法和等待函数相关的问题 我收到了这个http请求,可以得到响应。这是工作良好,没有问题 public async static Task<List<MyAccountData>> GetBalance() { HttpClient = new HttpClient(); string response = await client.GetStringAsync("

我是C#的新手。我 我遇到了一个与C#windows phone 8.0中的异步方法和等待函数相关的问题

我收到了这个http请求,可以得到响应。这是工作良好,没有问题

public async static Task<List<MyAccountData>> GetBalance()
{
       HttpClient = new HttpClient();
       string response = await client.GetStringAsync("http://xxxx/xxx/xxx");

       List<MyAccountData> data = JsonConvert.DeserializeObject<List<MyAccountData>>(response);

       return data;
}

所以我的问题是,我想调用MainModel类中的GetBalance方法,并将数据解析为LoadData方法(只需要使用in-LoadData方法访问数据)LoadData方法无法更改返回类型或无法使用async。那么这怎么可能呢

在Windows Phone 8 dev中使用异步等待没有区别:

public class MainModel
{
    public async void LoadData()
    {
        var data = await Foo.GetBalance();
    }
}

取决于您是希望
LoadData
同步(直到所有数据通过HTTP传输进来,然后锁定UI,然后才返回),还是希望开始该过程并立即返回。如果您不能将
LoadData
更改为async,那么这是您仅有的两个选项

如果希望
LoadData
同步:

public void LoadData() {
    var task = GetBalance();
    var result = task.Result; // will lock up the UI until the HTTP request returns
    // now do something with result
}
如果您希望它启动后台进程并立即返回,但由于某些原因不希望将
LoadData
标记为
async

public void LoadData() {
    BeginLoadData();
}
private async void BeginLoadData() {
    var result = await GetBalance();
    // now do something with result
}
尽管如此,我们没有理由不让
LoadData
async
async void
不会强制您以任何方式更改调用者(与
async
不同),并且它的分配与普通的旧非异步委托兼容:

public async void LoadData() {
    var result = await GetBalance();
    // now do something with result
}
// ...
LoadData(); // works just fine
Action myAction = LoadData; // works just fine

在处理异步操作时,需要等待操作完成。返回类型async/await方法始终为Task(TResult),要访问async/Wait的结果,您需要使用result属性。result属性的get访问器确保异步操作在返回之前完成

    public void LoadData()
    {
        var  data = GetBalance().Result;
    }

如果您想要一个响应性的UI,即有可能被商店接受的UI,那么阻止异步操作不是一个选项

相反,您必须考虑一下在操作进行过程中希望UI的外观。在您考虑这一点的同时,还要考虑如果操作出错,您希望您的UI如何响应

然后你可以编写一个解决方案。如果捕获所有异常并干净地处理它们,则可以使用
async void
执行此操作:

public async void LoadData()
{
  try
  {
    ... // Set up "loading" UI state.
    var balance = await GetBalanceAsync();

    ... // Set up "normal" UI state.
    Balance = balance;
  }
  catch
  {
    ... // Set up "error" UI state.
  }
}
但是,我更喜欢使用我创建的名为
NotifyTaskCompletion
的类型,它是
Task
的数据绑定包装(如中所述)。使用
NotifyTaskCompletion
,加载数据变得简单得多:

public void LoadData()
{
  GetBalanceOperation = new NotifyTaskCompletion<Balance>(GetBalanceAsync());
}

public NotifyTaskCompletion<Balance> GetBalanceOperation // Raises INotifyPropertyChanged when set
public void LoadData()
{
GetBalanceOperation=新建NotifyTaskCompletion(GetBalanceAsync());
}
public NotifyTaskCompletion GetBalanceOperation//在设置时引发INotifyPropertyChanged

然后,用户界面可以将数据绑定到
NotifyTaskCompletion
上的属性,例如
IsNotCompleted
(对于“加载”状态)、
issucessfullycompleted
Result
(对于“正常”状态)以及
IsFaulted
ErrorMessage
(对于“错误”状态).

请为您的答案添加一些解释,以帮助其他人快速理解。为什么不能将LoadData()更改为async?
public void LoadData()
{
  GetBalanceOperation = new NotifyTaskCompletion<Balance>(GetBalanceAsync());
}

public NotifyTaskCompletion<Balance> GetBalanceOperation // Raises INotifyPropertyChanged when set