簡體   English   中英

WPF:異步進度條

[英]WPF: Asynchronous progress bar

我正在嘗試創建一個與主進程異步工作的進度條。 我創建了一個新事件並調用它然后每次我嘗試在進度條上執行操作時我收到以下錯誤:

“調用線程無法訪問此對象,因為另一個線程擁有它”

以下代碼是嘗試將進度條的實例作為對象發送到事件,它顯然失敗了,但它讓您了解代碼的外觀。

    private event EventHandler importing;

    void MdbDataImport_importing(object sender, EventArgs e)
    {
        ProgressBar pb = (ProgressBar)sender;
        while (true)
        {
            if (pb.Value >= 200)
                pb.Value = 0;

            pb.Value += 10;
        }
    }

    private void btnImport_Click(object sender, RoutedEventArgs e)
    {
        importing += new EventHandler(MdbDataImport_importing);
        IAsyncResult aResult = null;

        aResult = importing.BeginInvoke(pbDataImport, null, null, null);

        importing.EndInvoke(aResult);
    }

有沒有人有如何做到這一點的想法。

在此先感謝SumGuy。

你應該使用這樣的東西

pb.Dispatcher.Invoke(
                  System.Windows.Threading.DispatcherPriority.Normal,
                  new Action(
                    delegate()
                    {

                        if (pb.Value >= 200)
                            pb.Value = 0;

                        pb.Value += 10;
                    }
                ));

在你的while循環中

您需要將pbDataImport委派給調度程序。 只有GUI調度程序才能更改GUI控件:)

我進一步研究了它,異步方法和MSDN中的以下方法一樣。

在XAML中:

<ProgressBar Width="100" Height="20" Name="progressBar1">
    <ProgressBar.Triggers>
        <EventTrigger RoutedEvent="ProgressBar.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="progressBar1"  From="0" To="100" Duration="0:0:5"  />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </ProgressBar.Triggers>
</ProgressBar>

在C#中:

        ProgressBar progbar = new ProgressBar();
        progbar.IsIndeterminate = false;
        progbar.Orientation = Orientation.Horizontal;
        progbar.Width = 150;
        progbar.Height = 15;
        Duration duration = new Duration(TimeSpan.FromSeconds(10));
        DoubleAnimation doubleanimation = new DoubleAnimation(100.0, duration);
        progbar.BeginAnimation(ProgressBar.ValueProperty, doubleanimation);

我的問題是,當我希望進度條執行時,我正在執行存儲過程,這會保持進程,因此即使在異步時也會使進度條變得有點垃圾。

我想另一種可能性是使存儲過程操作異步,你們怎么想?

干杯,SumGuy

編輯(2010年5月17日)

似乎很多人都對這篇文章感興趣,所以我想我會加上這個。 我發現了一篇很棒的文章,它詳細描述了WPF中的異步工作以及進度條上的一些美味:

http://www.codeproject.com/KB/WPF/AsynchronousWPF.aspx

我更喜歡使用MVVM和BackgroundWorker。 這是一個這樣做的例子。

使用WPF的ProgressBar Control,BackgroundWorker和MVVM的進度條

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM