C# 背景线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BYH371256/article/details/83374932

本章讲述:背景线程
1 在界面初始化(InitializeComponent();)后 设置 在主界面弹出该窗口,然后阻塞其他线程执行,然后执行本窗体所有的事件,之后结束、关闭窗口,主程序继续执行 界面显示,并且等待执行完成后关闭
2 使用Loaded事件,绑定目标界面  Window_Loaded中定义背景线程等   在调用界面函数中 定义public static AutoResetEvent myResetEvent = new AutoResetEvent(false);
在背景线程CompletedWork 调用OperationSettingConnectViewModel.myResetEvent.Set();
界面show出后, 调用myResetEvent.WaitOne(100);

public partial class MainWindow : Window
{

	private BackgroundWorker m_BackgroundWorker;// 申明后台对象

	public MainWindow()
	{
		InitializeComponent();

		m_BackgroundWorker = new BackgroundWorker(); // 实例化后台对象

		m_BackgroundWorker.WorkerReportsProgress = true; // 设置可以通告进度
		m_BackgroundWorker.WorkerSupportsCancellation = true; // 设置可以取消

		m_BackgroundWorker.DoWork += new DoWorkEventHandler(DoWork);
		m_BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(UpdateProgress);
		m_BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedWork);

		m_BackgroundWorker.RunWorkerAsync(this);	//执行线程
	}


	void DoWork(object sender, DoWorkEventArgs e)		//主代码事件处理
	{
		BackgroundWorker bw = sender as BackgroundWorker;
		MainWindow win = e.Argument as MainWindow;

		int i = 0;
		while ( i <= 100 )
		{
			if (bw.CancellationPending)
			{
				e.Cancel = true;
				break;
			}

			bw.ReportProgress(i++);
 
			Thread.Sleep(1000);

		}
	}

	void UpdateProgress(object sender, ProgressChangedEventArgs e)	//更新 通知界面更新
	{
		int progress = e.ProgressPercentage;

		label1.Content = string.Format("{0}",progress);
	}


	void CompletedWork(object sender, RunWorkerCompletedEventArgs e)	//完成处理显示
	{
		if ( e.Error != null)
		{
			MessageBox.Show("Error");
		}
		else if (e.Cancelled)
		{
			MessageBox.Show("Canceled");
		}
		else
		{
			MessageBox.Show("Completed");
		}
	}


	private void button1_Click(object sender, RoutedEventArgs e)
	{
		m_BackgroundWorker.CancelAsync();
	}
}

猜你喜欢

转载自blog.csdn.net/BYH371256/article/details/83374932