Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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_Progress Bar - Fatal编程技术网

C# 进度条在跳

C# 进度条在跳,c#,wpf,multithreading,progress-bar,C#,Wpf,Multithreading,Progress Bar,当我启动程序时,我需要加载一些项目并初始化它们。所以我在线程中创建了一个进度条(下一个PB)。当加载开始时,所有的链接都正常,但在一瞬间PB停止,并在init结束时跳转到end 在这里,每个初始化块都添加到进度条的线程 public void initMapBlocks(int n, int m) { this.Dispatcher.Invoke(delegate () { Loader.Visibility = Visibili

当我启动程序时,我需要加载一些项目并初始化它们。所以我在线程中创建了一个进度条(下一个PB)。当加载开始时,所有的链接都正常,但在一瞬间PB停止,并在init结束时跳转到end

在这里,每个初始化块都添加到进度条的线程

public void initMapBlocks(int n, int m)
    {
        this.Dispatcher.Invoke(delegate ()
        {
            Loader.Visibility = Visibility.Visible;
            mainWindow.Visibility = Visibility.Hidden;
        });
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                this.Dispatcher.Invoke(delegate ()
                {
                    MapPart mp = new MapPart();
                    mainCanvas.Children.Add(mp);
                    Loader.addPoint(1);
                });
            }
        }
        this.Dispatcher.Invoke(delegate ()
        {
            Loader.Visibility = Visibility.Hidden;
            mainWindow.Visibility = Visibility.Visible;
        });

    }
----更新2----

private void Window_Loaded(object sender, RoutedEventArgs e)
    {

        Thread thread = new Thread(new ThreadStart(() => initMapBlocks(100, 100)));
        thread.Start();
    }

您的
initMapBlocks
方法同时生成(MapPart)和使用(添加加载程序的值和maincavas子项)。您可以使用
System.Collections.Generic.Queue

您可以这样定义队列

private Queue<MapPart> myQueue = new Queue<MapPart>();
你可以简单地写这篇文章

myQueue.Enqueue(mp);
您可以在构造函数中定义Dispatchermer以供使用

DispatcherTimer myTimer = new DispatcherTimer {
    Interval = TimeSpan.FromMilliseconds(1)
};
myTimer.Tick += Consume;
myTimer.Start();
您的
消费
方法

private void Consume(object sender, EventArgs args) {
    if (myQueue.Count > 0) {
        //you don't need `this.Dispatcher.Invoke(delegate...` too
        loaderBar.Value += myQueue.Dequeue();
        mainCanvas.Children.Add(mp);
    }
}

在哪里设置ProgressBar的值?您的代码段应该做什么?@mm8函数addPoint,我在更新中包含了它。loaderBar是进度条。你发布的所有代码都在UI线程上运行。您长期运行的工作在哪里?@mm8我在描述中写道,initBlocks在另一个线程上工作。在更新2中,您可以使用它。但是initBlocks方法中的所有代码(实际迭代除外)都是在UI线程上执行的。
DispatcherTimer myTimer=new DispatcherTimer{Interval=TimeSpan.frommilluses(1)};myTimer.Tick+=消费;myTimer.Start();线程线程=新线程(新线程开始(()=>initMapBlocks(100100));thread.Start()消费将在线程结束后工作\好的,我发现一个问题:)
DispatcherTimer myTimer = new DispatcherTimer {
    Interval = TimeSpan.FromMilliseconds(1)
};
myTimer.Tick += Consume;
myTimer.Start();
private void Consume(object sender, EventArgs args) {
    if (myQueue.Count > 0) {
        //you don't need `this.Dispatcher.Invoke(delegate...` too
        loaderBar.Value += myQueue.Dequeue();
        mainCanvas.Children.Add(mp);
    }
}