我有以下情况:
同时,我希望更新具有某些状态的进度条或文本框--因此我尝试了以下操作:
在这两种情况下,在获取任务结果之前,我的GUI都不会更新。如果你能给我指明正确的方向,我会非常感激的。
private void button1_Click ( object sender, EventArgs e )
{
bw.RunWorkerAsync(); // Updates a textbox
Task<bool> test2 = new Task<bool>( () => _AuthHandler( sender, e, textBox1.Text, textBox2.Text ) );
try
{
test2.Start();
bool result = test2.Result;
//bool result = _AuthHandler.Invoke( sender, e, textBox1.Text, textBox2.Text );
if ( result )
{
//Do Somethin..
}
}
catch(Exception e) {
//Do Something
}
}
// -------BW TEST CODE --------//
public void smthn ()
{
textBox3.Text += ".";
}
void bw_DoWork ( object sender, DoWorkEventArgs e )
{
for(int i = 0;; i++)
{
bw.ReportProgress( i );
Thread.Sleep( 250 );
}
}
bool result = false;
void bw_RunWorkerCompleted ( object sender, RunWorkerCompletedEventArgs e )
{
MessageBox.Show( "Result Set" );
result = (bool)e.Result;
}
void bw_ProgressChanged ( object sender, ProgressChangedEventArgs e )
{
if ( textBox3.InvokeRequired )
{
this.Invoke( new Action( smthn ) );
}
else
{
smthn();
}
}发布于 2014-01-15 18:00:13
您正在阻塞UI线程,直到一些非UI工作完成为止。别干那事。让UI线程执行UI工作,将非UI工作安排在另一个线程中,然后让它什么也不做;它将返回到处理其他UI事件。
BackgroundWorker是专门为让UI做一些非UI工作和用进度或结果更新UI而设计的。让BGW的DoWork方法完成实际工作,更新更新处理程序中的进度条,并在已完成的处理程序中显示结果。BGW将负责运行UI线程中除DoWork事件之外的所有事件,因此不需要手动调用UI线程。
您的代码不能工作的原因是,您通过等待任务来阻塞UI线程,而且由于任务被阻塞,BGW进度事件中计划的UI更新在整个任务完成之前没有机会运行。
发布于 2014-01-15 17:56:24
网络任务应该通过使用DoWork()方法在后台线程中运行,然后根据需要调用ReportProgress(),然后在主UI线程中订阅ProgressChanged事件,并更新您的ProgressBar
发布于 2014-01-18 07:52:04
谢谢各位..。我意识到我在阻止UI线程。因此,我创建了一个包含两个后台工作人员的泛型类:进度事件、bar和一个启动完成的事件->,它调用后处理函数。我想这是你们大多数人推荐的方法。
还有别的选择吗?那异步/等待呢?
https://stackoverflow.com/questions/21144781
复制相似问题