C# WinRT中的后台任务

C# WinRT中的后台任务,c#,windows-runtime,bing-maps,portable-class-library,winrt-async,C#,Windows Runtime,Bing Maps,Portable Class Library,Winrt Async,情况: 我从不同的互联网位置获取json对象 这些包含了我放在地图上的许多地理坐标。 那很好用 问题是: 但是,当我从互联网位置获取数据时,我会得到一个阻塞用户界面。 有没有在后台运行的方法 我尝试了异步功能,但是我也得到了一个阻塞的UI 这里有一些代码 来电者 JSONDATA类中的方法 public async Task<bool> DoOperations(){ // do requests and some stuff.. var fetchedElement

情况:

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

这些包含了我放在地图上的许多地理坐标。 那很好用

问题是:

但是,当我从互联网位置获取数据时,我会得到一个阻塞用户界面。 有没有在后台运行的方法

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

这里有一些代码 来电者

JSONDATA类中的方法

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
}
公共异步任务DoOperations(){
//做一些请求和一些事情。。
var fetchedElements=getdata();//不异步,因为它位于可移植库中
foreach(fetchedElements中的var元素)
OneEvent(元素);//引发一个事件,将元素分配到Bing映射
}

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

我建议的第一件事是将
getdata
更改为
async
Microsoft.Bcl.Async
NuGet包扩展了对可移植类库的
Async
支持

如果不可能,则必须在后台线程上执行
getdata
,如下所示:

public async Task<bool> DoOperations()
{
  var fetchedElements = await Task.Run(() => getdata());
  foreach (var element in fetchedElements)
    OnEvent(element);
}
公共异步任务DoOperations()
{
var fetchedElements=await Task.Run(()=>getdata());
foreach(fetchedElements中的var元素)
OnEvent(元素);
}
另外,“背景任务”一词有其特殊含义。您实际需要的是在线程池线程(或后台线程)上运行代码,这与WinRT所称的“后台任务”不同

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