1

WPF と C# を使用してアプリケーションを作成しています。私がやろうとしているのは、ボタンを押してからしばらくの間、キャンバスにたくさんの形を印刷することです。ボタンを押した瞬間、すべてが一斉に飛び出します。すべての「印刷」の間にスレッドをしばらくスリープさせようとしましたが、それは役に立ちません。すべてが一度に飛び散るまでに時間がかかります。私が達成したいのは、シェイプが 0.5 秒間隔で一度に 1 つずつポップアップすることです。コードは次のとおりです。

   private void Create_Click(object sender, RoutedEventArgs e)
   {
        Random random = new Random();
        for (int i = 0; i < 50; i++)
        {
            Thread.Sleep(500);
            Path f = FlowerFactory.createFlower(FlowerBP, true);
            Canvas.SetLeft(f, random.Next(0, 1650));
            Canvas.SetTop(f, random.Next(0,1000));
            DrawBoard.Children.Add(f);
        }}
4

3 に答える 3

3

まず、UIの更新をブロックしないように、バックグラウンドスレッドでループを実行する必要があります。次に、UIレンダリングタスクをUIスレッドに送り返します。1つ目は、を使用できTask.Factory.StartNew、2つ目はDispatcher.Invoke:を使用します。

Random random = new Random();
Task.Factory.StartNew(() =>
{
    for (int i = 0; i < 50; i++)
    {
        Thread.Sleep(500);
        Dispatcher.Invoke(DispatcherPriority.Render, new Action(() =>
        {
            Path f = FlowerFactory.createFlower(FlowerBP, true);
            Canvas.SetLeft(f, random.Next(0, 1650));
            Canvas.SetTop(f, random.Next(0,1000));
            DrawBoard.Children.Add(f);
        }));
    }
});
于 2012-11-23T18:44:14.540 に答える
1

GUI を担当するメイン スレッドをスリープ状態にするのは間違った決定でした。

DispatchTimerを使用してみてください。例えば:

DispatcherTimer m_dispatcherTimer = new DispatcherTimer();
int m_count = 50;

private void Init()
{
    m_dispatcherTimer.Tick += new EventHandler(OnTick);
    m_dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
}

private void Create_Click(object sender, RoutedEventArgs e)
{
    m_count = 50;
    m_dispatcherTimer.Start();
}

private void OnTick(object sender, EventArgs e)
{
    // Draw your shapes here

    if(0>=--m_count)
    {
        m_dispatcherTimer.Stop();
    }
}
于 2012-11-23T18:48:23.513 に答える
0
using System.Reactive.Concurrency;
using System.Reactive.Linq;
...
var subscription = Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(50).Subscribe(x=>CreateRandomFlower);
于 2012-11-23T18:51:05.393 に答える