0

サービス応答を受け取るまで、UI ボタン​​をクリックした後も継続的に実行されるように、WPF アプリケーションの継続的な進行状況バーに新しいスレッドを割り当てたいと考えています。

以下のようなコードを実行したのですが、プログレスバー(MclarenServerCecksProgressBar)が全く動いていないようです

MclarenServerCecksProgressBar.Visibility = Visibility.Visible;
var uiThread = new Thread(() =>
{
progressBarDisptacher = MclarenServerCecksProgressBar.Dispatcher;


// allowing the main UI thread to proceed 
System.Windows.Threading.Dispatcher.Run();    
});
uiThread.SetApartmentState(ApartmentState.STA);
uiThread.IsBackground = true;
uiThread.Start();      
string[] servicesss = getServices(servername,server);
DataTable dtd = esd.getListOfServices(servername, usrid.Text.ToString(),   
userpass.Password.ToString(), servicesss);
MclarenServerCecksProgressBar.Visibility = Visibility.Hidden;

これを達成するために私に提案するよう手配してください。他の指針は非常に役に立ちます。

4

3 に答える 3

0

最後に、いくつかのトリックを実行してこれを達成しました。私は DependencyProperty と Dispatacher でデリゲートを使用してプログレスバーを更新しました。これは、さまざまな試行を経て長い間機能する方法です。以下のようなコードを参照してください。

private delegate void UpdateProgressBarDelegate(
    System.Windows.DependencyProperty dp, Object value);

private void startProgessBar(string controlname)
{
    MclarenServerCecksProgressBar.Visibility = Visibility.Visible;


    //Stores the value of the ProgressBar

    //Create a new instance of our ProgressBar Delegate that points
    // to the ProgressBar's SetValue method.
    UpdateProgressBarDelegate updatePbDelegate =
        new UpdateProgressBarDelegate(MclarenServerCecksProgressBar.SetValue);
    bool _status = true;
    int flag = 0;
    double value = 0;

    do
    {

        /*Update the Value of the ProgressBar: */

        Dispatcher.Invoke(updatePbDelegate,
            System.Windows.Threading.DispatcherPriority.Background,
            new object[] { System.Windows.Controls.ProgressBar.ValueProperty, value });


                if (flag == 0)
                {
                    flag == 1
                    _status = processesServices(controlname);
                }
                if (_status == false)
                {
                    MclarenServerCecksProgressBar.Visibility = Visibility.Hidden;
                }
    }
    while (_status);
}

とにかく、関数からの応答を受け取るまでprogessbarを実行しようとしていたことを修正するのは汚いかもしれません。この方法を改善するための他の提案は非常に高く評価されます. これを改善するための提案や支援を歓迎します。

于 2013-03-29T23:19:32.887 に答える
0

コードのプログレスバーの値セットの方法がわかりません。また、なぜこのハッキングをスレッドで使用しているのかよくわかりません。あなたの質問を正しく理解していれば、プログレスバーでこれを行う方法の例を作成しました。

<Window x:Class="WpfApplication5.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"
    Height="350"
    Width="525">
<Grid>
    <ProgressBar Height="10"
             HorizontalAlignment="Left"
             Margin="12,12,0,0"
             Name="progressBar1"
             VerticalAlignment="Top"
             Width="100"
             Visibility="Hidden" />
    <Button Content="Button"
        Height="23"
        HorizontalAlignment="Left"
        Margin="30,54,0,0"
        Name="button1"
        VerticalAlignment="Top"
        Width="75"
        Click="button1_Click" />
</Grid>
</Window>

using System;
using System.Threading;
using System.Windows;

namespace WpfApplication5 {
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }

        void button1_Click(object sender, RoutedEventArgs e) {
            progressBar1.Visibility = Visibility.Visible;
            Action method = () => {
                Action<int> method2 = (val) => {
                    progressBar1.Value = val;
                };
                for (int i = 0 ; i < 10 ; i++) {
                    Thread.Sleep(500);
                    Dispatcher.BeginInvoke(method2, i * 10);
                }
                Action method3 = () => {
                    progressBar1.Visibility = Visibility.Hidden;
                };
                Dispatcher.BeginInvoke(method3);
            };
            method.BeginInvoke(null, null);
        }
    }
}
于 2013-03-29T07:37:13.093 に答える