0

これは私の問題の小さな例です。同じエラーに関する他の質問から解決できませんでした。

UI スレッドは、次の行を持つボタン クリックから関数を呼び出します。

await DataSet.AddFileAsync(String.Format("ms-appdata:///local/IMM_FACE_DB/{0}", file.Name));

AddFileAsync は次のようになります。

public ObservableCollection<Model> Data {get;set;}
public Task AddFileAsync(string path)
{
     return Task.Factory.StartNew((state) =>
     {
         // Here some IO and computation is done, eventually some content is added 
         // to Data. Data is also bound to a GridView and this fails.

         //I assumed that TaskScheduler.FromCurrentSynchronizationContext()
         // would solve this, but it does not.
     }, TaskScheduler.FromCurrentSynchronizationContext());
} 

上記のコードで書いたように、TaskScheduler はそれが UI スレッドで実行されていることを確認できると想定しました。AddFileAsync は Databound Buttonclick コマンドから呼び出されるためです。

どこで何かを誤解しましたか? そして、これを行うための正しい待機は何でしょうか。

4

1 に答える 1

3

StartNew見るからにそんな必要ない…

public async Task AddFileAsync(string path)
{
  // Do some IO
  var ioResult = await DoIoAsync(path);

  // Do some computation
  var computationResult = await Task.Run(() => DoComputation(ioResult));

  // Update Data
  Data.Add(computationResult);
} 
于 2013-02-02T19:21:38.463 に答える