Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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#_Visual Studio 2010_Statusbar - Fatal编程技术网

C# 循环运行时生成“忙碌”或“工作”对话框

C# 循环运行时生成“忙碌”或“工作”对话框,c#,visual-studio-2010,statusbar,C#,Visual Studio 2010,Statusbar,我正在使用MSVS2010,在创建状态栏或状态条时遇到问题。我有一个循环,它做一些事情,运行一些函数。这是一个循环。我需要做的就是显示某种形式,上面写着忙。。。或者工作。。而在这个循环中。有人对如何完成这一点有具体的分步指导吗?我在网上看过一些教程和例子,但对于如何做到这一点,我没有一个清晰的概念。这方面的任何帮助都会很好。提前感谢。简单的方法是使用带有“marquee”样式属性的进度条,这有助于让用户等待。 因此,在循环之前设置“marquee”属性,然后可以返回默认值和/或在循环结束后隐藏此

我正在使用MSVS2010,在创建状态栏或状态条时遇到问题。我有一个循环,它做一些事情,运行一些函数。这是一个循环。我需要做的就是显示某种形式,上面写着忙。。。或者工作。。而在这个循环中。有人对如何完成这一点有具体的分步指导吗?我在网上看过一些教程和例子,但对于如何做到这一点,我没有一个清晰的概念。这方面的任何帮助都会很好。提前感谢。

简单的方法是使用带有“marquee”样式属性的进度条,这有助于让用户等待。 因此,在循环之前设置“marquee”属性,然后可以返回默认值和/或在循环结束后隐藏此进度条。
我是否足够清楚,或者您是否需要一些代码示例

你可以用一个标签。 只需添加一个标签并将其命名为stateLabel

然后在您的代码中执行如下smth:

stateLabel.text = "Working..."; //Change the text of the Label
while(statement = true) //Your Loop
{
    //Do your work
}
stateLabel.text = "Finished work";

您可以执行一些简单的操作,如更改光标:

//change cursor to wait cursors
this.ForceCursor = Cursors.Wait;

//do loop
while(true)
{//do work}

//change the cursor back to regular arrow when work is completed
this.ForceCursor = Cursors.Arrow;
或者,只要不在while循环中使用UI控件,就可以在另一个线程上进行循环。只需在窗口中的某个位置放置一个进度条,称之为myProgBar,如果不知道循环需要多长时间,则将其设置为不确定。以下是我将如何做到这一点:

//create instance of loading window
YourLoadWindow loadWin = new YourLoadWindow();

//Create a thread that will do our loop work.
Thread t = new Thread(new ThreadStart(() => 
{
//do our looping;
while (true) {//do work}

//when loop is done, we want to hide the loading window
//but we created it on a different thread, so we must use its dispatcher to do
//the work from this thread
loadWin.Dispatcher.Invoke(new Action(() => { loadWin.Close(); }));

}));

//show load window
loadWin.Show();

//start doing our work
t.Start();

到目前为止,你做了什么?在BackgroundWorker中运行你的循环。到目前为止,我已经创建了一个表单,显示了我所在的当前元素以及循环中的元素总数。因此,表单将显示如下内容…初始化3中的1。它会增加。对于这样一个小的数字,您几乎从来没有看到表单弹出窗口,因为我让它在退出循环后关闭。计数和我正试图捕获的ArcMap刷新事件存在一些问题。因此,我不需要使用计数,只需要一个简单的框来显示正在运行的工作状态。是的,我不打算对循环中的UI控件做任何操作。我创建了一个小表单,上面写着“工作…”。。。。。它在循环之前弹出,在循环结束时关闭。工具箱中有一个progressBar工具。当循环运行时,如何更新此进度条>?问题是,如果在UI线程上执行循环,则必须等到循环完成后才能对UI执行任何操作。这包括更新进度条。这就是为什么必须在不同的线程上执行循环,以便UI线程可以处理更新进度条之类的事情。多线程可能会为您提供最佳性能。因此,在我的示例中,将myProgBar替换为具有进度条的窗口。