如何在C#windows phone 8中使用等待功能返回数据?
我是C#的新手。我 我遇到了一个与C#windows phone 8.0中的异步方法和等待函数相关的问题 我收到了这个http请求,可以得到响应。这是工作良好,没有问题如何在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("
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
asyncasync 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