C# 스레드 및 위임
관계 정리
Thread 객체 만들기 스레드
장점
public static void main()
{
// ( , void )
ThreadStart start = new ThreadStart(ConsoleInformation);
//
Thread thread = new Thread(start);
//
thread.Start();
}
//
public static void ConsoleInformation()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine(string.Format("this is {0} time run in Thread A",i));
Thread.Sleep(500);
}
}
인스턴스 코드 2: UI의 하위 스레드 처리를 수정해야 함(WinFrom 프로그램)
///
/// Thread
///
/// ,
private void Base_btn_start_Click(object sender, EventArgs e)
{
//UI , ListView
UI_lv_content.Items.Clear();
// ( , void )
ThreadStart start = new ThreadStart(UpdateListViewContent);
//
Thread thread = new Thread(start);
//
thread.Start();
}
// , UI, UI
private void UpdateListViewContent()
{
for (int i = 0; i < 5; i++)
{
// , ,
//this.UI_lv_content.Items.Add(string.Format("this is {0} time in Thread",i));
// UI ( !)
//Control.CheckForIllegalCrossThreadCalls = false;
// , ,
if (UI_lv_content.InvokeRequired)
UI_lv_content.Invoke(new Del_UpdateListViewContentParam(Invoke_UpdateListViewContent), i);
else
Invoke_UpdateListViewContent();
}
}
// UI ( )
private delegate void Del_UpdateListViewContentParam(int i);
// UI
private void Invoke_UpdateListViewContent(int i)
{
this.UI_lv_content.Items.Add(string.Format("this is {0} time in Thread param", i));
this.Update();
//
Thread.Sleep(500);
}
实例代码3:通过对象参数传递并获取子线程结果
///
/// , Thread
///
/// Java Runnable ,
/// , Thread
private void UI_btn_start4_Click(object sender, EventArgs e)
{
CustomParam param=new CustomParam();
param.X = 12;
param.Y = 24;
ThreadStart start = new ThreadStart(param.RunInThread);
Thread thread = new Thread(start);
thread.Start();
// , , UI
while (thread.IsAlive)
Application.DoEvents();
// ,
UI_lv_content.Items.Clear();
UI_lv_content.Items.Add("finished : " + param.Coordinate);
UI_lv_content.Update();
}
// ( A)
private delegate void Del_UpdateListViewContent();
参数类申明
public class CustomParam
{
private int m_X;
private int m_Y;
private string m_coordinate;
// delegate void Del_UpdateListViewContent()
public void RunInThread()
{
m_coordinate = string.Format("({0},{1})", X, Y);
Thread.Sleep(1000);
}
//getter setter
}
그러나 이러한 방식으로 UI를 수정하면 UI 컨트롤이 패라메트릭 클래스로 전달되어 구조화된 프로그램 설계가 손상됩니다.
함수 의뢰 생성 루트
장점
///
///
///
/// Thread , 。
/// ,
/// UI , ,
///
private void UI_btn_start3_Click(object sender, EventArgs e)
{
//UI
UI_lv_content.Items.Clear();
// UI
is_Wait4Main = UI_ck_IsWaitMain2.Checked;
// - UI
//Del_UpdateListViewContentAsyn del = new Del_UpdateListViewContentAsyn(Invoke_UpdateListViewContentAsyn);
// - UI;
Del_UpdateListViewContentAsyn del = new Del_UpdateListViewContentAsyn(Invoke_UpdateListViewContentAsynUI);
// ,
IAsyncResult iresult = del.BeginInvoke(10,12.1, null, null);
while (!iresult.IsCompleted)
Application.DoEvents();// UI , UI !
//
int result = del.EndInvoke(iresult);
//UI
//UI_lv_content.Items.Clear();
UI_lv_content.Items.Add("finished : " + result);
UI_lv_content.Update();
}
// ( C)
private delegate int Del_UpdateListViewContentAsyn(int max,double min);
// - UI
private int Invoke_UpdateListViewContentAsyn(int max,double min)
{
Thread.Sleep(2000);
return new Random().Next(20);
}
为了在子线程运行过程中,不造成主线程拥塞,一定要对主线程拥塞进行处理
实例代码2:需要修改UI的子线程处理
// - UI
private int Invoke_UpdateListViewContentAsynUI(int max, double value)
{
// UI -
for (int i = 0; i < 5; i++)
{
if (UI_lv_content.InvokeRequired)// ( Thread , 2)
UI_lv_content.Invoke(new Del_UpdateListViewContentParam(Invoke_UpdateListViewContent), i);
else
Invoke_UpdateListViewContent();
}
Thread.Sleep(2000);
return new Random().Next(20);
}
기타 고려 사항
주 스레드 혼잡 처리
Thread 객체의 주 정체 처리
Thread thread = new Thread(start);
thread.Start();
while (thread.IsAlive)
Application.DoEvents();
함수 의뢰의 혼잡 처리
IAsyncResult iresult = del.BeginInvoke(10,12.1, null, null);
while (!iresult.IsCompleted)
Application.DoEvents();
간단한 백엔드 처리 모듈 BackgroundWorker
설명
인스턴스 코드
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
구체적인 사용 코드
private void UI_btn_start5_Click(object sender, EventArgs e)
{
// backgroundWorker1
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();
//UI
UI_lv_content.Items.Clear();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
//
for (int i = 1; i < 11; i++)
{
Thread.Sleep(1000);
// UI
backgroundWorker1.ReportProgress(i,""+i);
}
//
e.Result = new Random().Next(25);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// , , UI
UI_lv_content.Items.Add(String.Format("doing... {0}/10, value : {1}",e.ProgressPercentage,e.UserState.ToString()));
UI_lv_content.Update();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//
UI_lv_content.Items.Add("finish:"+e.Result);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.