2

この状況:

私はさまざまなインターネットの場所、json オブジェクトから取得します。

これらには、BingMap に配置した多くの地理座標が含まれています。それは非常にうまく機能します。

問題:

しかし、インターネットの場所からデータを取得すると、ブロッキング UI が表示されます。それをバックグラウンドで実行する方法はありますか?

非同期機能を試しましたが、ブロッキング UI も表示されます..

ここにいくつかのコード Caller

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することですasyncMicrosoft.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 に答える