2

情况:

我从不同的互联网位置获取 json 对象。

这些包含我放在 BingMap 上的许多地理坐标。效果非常好。

问题:

但是当我从互联网位置获取数据时,我得到了一个阻塞的 ui。有没有办法在后台运行它?

我尝试了异步功能,但我也得到了一个阻塞 UI ..

这里有一些代码调用者

public async void Caller_Click(){
    await jsonDataClass.DoOperations();
}

jsonDataClass中的方法

public async Task<bool> DoOperations(){
    // do requests and some stuff..
    var fetchedElements = getdata(); // not async, because its in a portable lib
    foreach (var element in fetchedElements)
      OnEvent(element); // raises an event to assing the element to the Bing map
}
4

1 回答 1

7

不要忽略编译器警告。特别是,如果你有一个async不使用的方法await,那么编译器会特别告诉你该方法不是异步的,而是同步运行的。

我建议的第一件事是进行更改getdata,使其成为async. Microsoft.Bcl.AsyncNuGet 包将支持扩展async到可移植类库。

如果这不可能,那么您将不得不getdata在后台线程上执行,如下所示:

public async Task<bool> DoOperations()
{
  var fetchedElements = await Task.Run(() => getdata());
  foreach (var element in fetchedElements)
    OnEvent(element);
}

PS 术语“后台任务”在 WinRT中具有特殊含义。您实际需要的是在线程池线程(或后台线程)上运行代码,这与 WinRT 所谓的“后台任务”不同。

于 2013-09-05T12:03:43.650 回答