내용 보기
작성자
관리자 (IP : 192.168.0.1)
날짜
2022-12-28 00:12
제목
[C#] [스크랩] SynchronizationContext 기본 사용법
가령 Windows Forms 같은 경우, 2차 스레드에서 UI를 생성한 스레드로 작업을 맡기고 싶을 때가 있는데요, 이를 위해 Windows Forms는 Control.Invoke/BeginInvoke를 제공합니다. // Windows Forms
public partial class Form1 : Form
{
public Form1()
{
System.Diagnostics.Trace.WriteLine($"{SynchronizationContext.Current}");
// 출력 결과: System.Windows.Forms.WindowsFormsSynchronizationContext
InitializeComponent();
}
}
Console/Service Application을 위한 SynchronizationContext - AsyncContext ; https://www.sysnet.pe.kr/2/0/12231
public partial class Form1 : Form
{
public Form1() { }
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem((arg) =>
{
button1.BeginInvoke(() =>
{
this.button1.Text = "TEST"; // UI 스레드에서 실행
}, null);
});
}
}
private void button1_Click(object sender, EventArgs e) { SynchronizationContext? ctx = SynchronizationContext.Current; ThreadPool.QueueUserWorkItem((arg) => { // Control.BeginInvoke ==> SynchronizationContext.Post // Control.Invoke ==> SynchronizationContext.Send ctx?.Post((arg1) => { this.button1.Text = "TEST"; // UI 스레드에서 실행 }, null); }); }
private void button1_Click(object sender, EventArgs e) { Task.Factory.StartNew(() => { this.button1.Text = "TEST"; // UI 스레드에서 실행 }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); }
private void button1_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
button1.Invoke(() =>
{
this.button1.Text = "TEST";
});
});
}
|
출처1
https://www.sysnet.pe.kr/2/0/13190?pageno=0
출처2