Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#要设置动画的不确定进度条_C#_Wpf_Multithreading_Asynchronous_Progress Bar - Fatal编程技术网

C#要设置动画的不确定进度条

C#要设置动画的不确定进度条,c#,wpf,multithreading,asynchronous,progress-bar,C#,Wpf,Multithreading,Asynchronous,Progress Bar,我对C#WPF还相当陌生,在我的主代码继续运行时,我需要帮助尝试让我的不确定进度条动画化。我已经研究并尝试了很多不同的线程方法和后台工作人员等等…但似乎没有任何效果。下面的代码是我见过的最接近的代码,我可以看到进度条开始动画化,我的主代码继续运行,但是我得到了一个异常“调用线程无法访问这个对象,因为它是另一个线程拥有的。”我非常感谢任何关于如何实现这一点的见解 public partial class MainWindow : Window { public MainWindow()

我对C#WPF还相当陌生,在我的主代码继续运行时,我需要帮助尝试让我的不确定进度条动画化。我已经研究并尝试了很多不同的线程方法和后台工作人员等等…但似乎没有任何效果。下面的代码是我见过的最接近的代码,我可以看到进度条开始动画化,我的主代码继续运行,但是我得到了一个异常“调用线程无法访问这个对象,因为它是另一个线程拥有的。”我非常感谢任何关于如何实现这一点的见解

 public partial class MainWindow : Window
{

    public MainWindow()
    {
       InitializeComponent();
    }

    [STAThread]
    private async void cmsServerConnect(object sender, RoutedEventArgs e)
    {
        Login form = new Login();
        form.ShowDialog();

        if (form.cancelClicked == true && form.enter_Pressed == false)
        {
            return;
        }

        //Create new thread to have indeterminate progress bar run on
        //Set new thread appartmentstate to STA
        //Start thread
        Connect_Progress progress = new Connect_Progress();
        Thread t = new Thread(() => progress.Show());
        t.SetApartmentState(ApartmentState.STA);
        t.Start();

        //Using  async at method declaration
        //await is allowing the UI to continue updating while running the task connection.cmsConnect()
        Ribbon_Buttons connection = new Ribbon_Buttons();
        int connected = await Task.Run(() => connection.cmsConnect(form.id, form.Pword));

        if (connected == 2)
        {
            BitmapImage image = new BitmapImage();
            image.BeginInit();
                image.UriSource = new Uri("pack://application:,,,/Images/Circle_Green.png");
            image.EndInit();

            this.Ribbon_Button_ACM12_Connection.SmallImageSource = image;
            this.Ribbon_Button_ACM12_Connection.Label = "Connected";
        }

        t.Abort();

        this.Activate();
        this.Topmost = true;
        this.Topmost = false;
        this.Focus();
    }

您应该使用后台工作程序

xaml


c#

private readonly BackgroundWorker worker=new BackgroundWorker();
公共主窗口()
{
初始化组件();
worker.DoWork+=worker\u DoWork;
worker.RunWorkerCompleted+=worker\u RunWorkerCompleted;
}
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
对于(int i=0;i<100;i++)
{
Dispatcher.BeginInvoke((操作)(()=>
{
myProgressBar.Value=i;
}));
睡眠(100);
}
}
私有void worker\u RunWorkerCompleted(对象发送方,
RunWorkerCompletedEventArgs(e)
{
myProgressBar.Value=100;
}
私有无效myButton_单击(对象发送方,路由目标)
{
worker.RunWorkerAsync();
}
}

为什么使用
STAThread
属性?我一直得到一个例外,运行进度条的线程必须是STA,我在网上找到的一个修复方法是将该属性设置在方法之上……然而,它从未奏效,我没有意识到它仍然存在。这是什么
功能区按钮?你到底从哪里得到了例外?我猜它在
Ribbon\u Buttons
行上,对吗?Ribbon\u Buttons只是我制作的一个类,它包含了我功能区上所有按钮的代码。异常是在“Thread t=new Thread(()=>progress.Show());”行中抛出的,带有wait的功能区按钮部分实际上开始正常运行。。。
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <ProgressBar x:Name="myProgressBar" Width="400" Grid.Row="0" Height="30" />
    <Button x:Name="myButton" Width="200" Height="30" Grid.Row="1" Click="myButton_Click" Content="Click Me" />
</Grid>
 private readonly BackgroundWorker worker = new BackgroundWorker();

    public MainWindow()
    {
        InitializeComponent();
        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    }
    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            Dispatcher.BeginInvoke((Action)(() =>
            {
                myProgressBar.Value = i;
            }));
            Thread.Sleep(100);
        }
    }

    private void worker_RunWorkerCompleted(object sender,
                                           RunWorkerCompletedEventArgs e)
    {
        myProgressBar.Value = 100;
    }
    private void myButton_Click(object sender, RoutedEventArgs e)
    {
        worker.RunWorkerAsync();
    }
}