0

BackgroundWorker を使用してレスポンシブ UI を実現できます。これが例です。

 private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        Thread test = new Thread(new ThreadStart(TestThread));
        test.Start();
    }
 private void TestThread()
    {
        for (int i = 0; i <= 1000000000; i++)
        {
            Thread.Sleep(1000);
            Dispatcher.Invoke(
                new UpdateTextCallback(this.UpdateText),
                new object[] { i.ToString() }
            );
        }
    }
    private void UpdateText(string message)
    {
        Tests.Add(message);
    }
public delegate void UpdateTextCallback(string message);
        private ObservableCollection<string> tests = new ObservableCollection<string>();

    public ObservableCollection<string> Tests
    {
        get { return tests; }
        set { tests = value; }
    }

UI:

<StackPanel>
    <Button Content="Start Animation" Click="Button_Click" />
    <Button Content="Start work" Click="Button_Click_1" />
    <Rectangle Name="rec1" Fill="Red" Height="50" Width="50"/>
    <ListView ItemsSource="{Binding Tests}" ScrollViewer.CanContentScroll="True" />
</StackPanel>

ここでアニメーションを開始し、同時に BackGroundWorker と Dispatcher を使用して UI を更新できます。

私はこのような非同期を通じて達成できるのと同じこと:

 private async void GetTests(ObservableCollection<string> items)
    {
        for (int i = 0; i < 20; i++)
        {
            var s = await GetTestAsync(i);
            items.Add(s);
        }
    }



async Task<string> GetTestAsync(int i)
    {
        await Task.Delay(2000);
        return i.ToString() + " Call - " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
    }

Q.1 BackgroundWorker よりも非同期を使用する利点はありますか?

そして、それらのいずれかを使用することを決定し、他の使用を避ける必要があるシナリオは何ですか.

Q.2 Async - Await の使い方を WPF で理解したい。それなしではできないことのように、今ではそれで簡単にできるようになりました。

ガイドしてください。

4

1 に答える 1

3

Q.1BackgroundWorkerよりもAsynchronyを使用する利点はありますか?

確かに-主に、コードははるかに単純です。この特定のケースでは、複雑なことは何もしていませんが、複数のタスクの調整を開始するとすぐに、より複雑な制御フロー(ループなど)があり、エラーなどを処理したい場合、大きな違いが生じます。

さらに、この場合、余分なスレッドを節約します-2回目の呼び出しでは、すべてがUIスレッドで発生します。より現実的な例では、Webサービスの呼び出しなどを待つ可能性が高く、余分なスレッドを拘束する必要はありません。

Q.2Asyncの使用法を理解したい-WPFの観点から待ってください。それなしではできないことのように、今ではそれを使って簡単に行うことができます。

理論的には、非同期でできることはすべて、非同期で以前にできることです。実際には、非同期コードを正しく効率的に記述する際の偶発的な複雑さは、ボイラープレートの量が非常に大きな障壁でした。

async / await機能を使用すると、同期コードのように見える非同期コードを、使い慣れた制御フローなどで記述できます。つまり、偶発的なものではなく、非同期がもたらす固有の複雑さだけを理解し、推論することができます。コールバックなどの記述の複雑さ。

于 2012-09-09T07:22:52.113 に答える