Elf*_*foc 2 .net c# multithreading backgroundworker winforms
我想在执行功能期间创建加载屏幕 - 比如在游戏,新窗口或某些图形中加载屏幕.
所以我按下按钮"开始" - 应用程序开始做一些东西,子窗体窗口显示图形 - "功能正在进行中,请稍候"
怎么做?
您可以使用BackgroundWorker在单独的线程中执行您的功能.BackgroundWorker具有许多功能,可以支持您正在寻找的功能.如果你没有使用另一个线程来执行你的函数,主线程(UI线程)将忙,子窗口将无法正常工作.
关于backgroundWorker的一些关键注意事项.DoWork在不同的线程中,向主线程报告进度并取消异步进程是BackgroundWorker中最重要的功能.下面的例子非常清楚地展示了这三个功能.但它显示任务完成的实际百分比.如果您只想显示消息和带有Marquee样式的ProgressBar,则不必打开标志,也不需要事件实现.WorkerReportsProgressProgressChanged
网上有大量的例子.
using System;
using System.Threading;
using System.ComponentModel;
class Program
{
static BackgroundWorker _bw;
static void Main()
{
_bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bw.DoWork += bw_DoWork;
_bw.ProgressChanged += bw_ProgressChanged;
_bw.RunWorkerCompleted += bw_RunWorkerCompleted;
_bw.RunWorkerAsync ("Hello to worker");
Console.WriteLine ("Press Enter in the next 5 seconds to cancel");
Console.ReadLine();
if (_bw.IsBusy) _bw.CancelAsync();
Console.ReadLine();
}
static void bw_DoWork (object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i += 20)
{
if (_bw.CancellationPending) { e.Cancel = true; return; }
_bw.ReportProgress (i);
Thread.Sleep (1000); // Just for the demo... don't go sleeping
} // for real in pooled threads!
e.Result = 123; // This gets passed to RunWorkerCompleted
}
static void bw_RunWorkerCompleted (object sender,
RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
Console.WriteLine ("You canceled!");
else if (e.Error != null)
Console.WriteLine ("Worker exception: " + e.Error.ToString());
else
Console.WriteLine ("Complete: " + e.Result); // from DoWork
}
static void bw_ProgressChanged (object sender,
ProgressChangedEventArgs e)
{
Console.WriteLine ("Reached " + e.ProgressPercentage + "%");
}
}
Run Code Online (Sandbox Code Playgroud)