C# WinRT中的后台任务
情况: 我从不同的互联网位置获取json对象 这些包含了我放在地图上的许多地理坐标。 那很好用 问题是: 但是,当我从互联网位置获取数据时,我会得到一个阻塞用户界面。 有没有在后台运行的方法 我尝试了异步功能,但是我也得到了一个阻塞的UI 这里有一些代码 来电者 JSONDATA类中的方法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
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);
}