最近在項目中要用到子線程運行結束向主線程通知的需求,利用線程上下文來實現線程之間的同步。
子線程結束后調用同步函數,向主線程發送時間字符串,改變主窗體的label標簽
label標簽改變事件觸發處理函數,進行顯示;
代碼如下:
主窗體:
public static MainForm comMainForm; //其他類可以直接調用此窗體的控件
public MainForm()
{
InitializeComponent();
comMainForm = this;
}
//任務中心標簽內容發生更新事件響應
private void taskFreshFlag_TextChanged(object sender, EventArgs e)
{
labResult.Visible = true;
labResult.Text = DateTime.Now.TimeOfDay.ToString();
}
工具類:
public class WebServiceConnect
{
private static SynchronizationContext mainThreadSynContext;
//此處修改為異步獲取任務方式
public static void GetTaskInfo(string taskInfoIn0)
{
mainThreadSynContext = SynchronizationContext.Current; //當前線程上下文
taskThread = new Thread(new ParameterizedThreadStart(webConnect));
taskThread.Start(taskInfoIn0);
}
//回調函數
private static void CallBack(object state)
{
//主線程報告信息
MainForm.comMainForm.taskFreshFlag.Text = "task" + DateTime.Now.TimeOfDay.ToString();
}
public static void webConnect(object taskInfoIn)
{
try
{
string taskInfoIn0 = taskInfoIn.ToString();
circle = false;
}
catch (Exception ex)
{
System.Net.WebException wex = ex as System.Net.WebException;
if (connCount > 1)
{
circle = false;
taskThread.Abort();
System.Windows.Forms.MessageBox.Show("通訊未連接!");
return;
}
}
mainThreadSynContext.Post(new SendOrPostCallback(CallBack), null); //通知主線程
}