1

これは、実行時間の長いタスク中に UI がブロックされて問題が発生したコードのスニペットです。同じことをしているように見える他の例を見てきましたが、これはうまくいきません。シンプルなものだと思います。

私は何が欠けていますか?

public class ClipManager
{
    async public Task<int> AddNewClipsAsync()
    {
        int rc = AddNewClips();  // does the work
        return rc;
    }
}

public partial class MainWindow : Window
{
private async void UpdateClick(object sender, RoutedEventArgs e)
{
    // Check event to update library from WindowsMain.xml.cs
    private async void UpdateClick(object sender, RoutedEventArgs e)
    {

        UpdateBtn.IsEnabled = false;
        Console.WriteLine("Start of Update");
        var cm = ClipManagement.Create();

        int rc = await cm.AddNewClipsAsync();  // long running method

        // UI unfreezes at this point
        Console.WriteLine("After Update of Update");
        await Task.Delay(30000);  // just debugging code
        Console.WriteLine("After delay");
        LibraryDG.Items.Refresh();
        UpdateBtn.IsEnabled = true;
    }
  }
}
4

1 に答える 1

4

あなたの電流AddNewClipsはUIをブロックします。Task.Runバックグラウンドで実行されるように、でラップする必要があります。

public class ClipManager
{
    async public Task<int> AddNewClipsAsync()
    {
        int rc = await Task.Run<int>(() => AddNewClips());  // does the work
        return rc;
    }
}

上記のコードは、AddNewClipsが UI 呼び出しを行わないことを前提としています。つまり、何らかのデータを処理し、何らかの結果を返すだけです。

于 2013-03-04T02:08:31.387 に答える