[英]C# - Listbox not updated when an entry is added to the list in a seperate thread
我有一個靜態類,可將日志打印到列表框中,因此可以在全局范圍內使用它,因此我使用了在cls_globalvariables靜態類中定義的BindingList的全局實例。 我將BindingList綁定到UI構造函數中的UI列表框。
public static class cls_globalvariables
{
public static BindingList<string> logList = new BindingList<string>();
....
}
static class LOGS
{
public static void LOG_PRINT(string logMessage, bool isNotError)
{
string now = DateTime.Now.ToString();
try
{
if (logMessage == "") return;
if (!isNotError)
logMessage = "<<<ERROR>>>" + logMessage;
// Output to text file.
using (StreamWriter w = System.IO.File.AppendText(cls_globalvariables.systemlogpath))
{
w.WriteLine("[" + now + "][" + logMessage + "]");
w.Close();
}
// Save to memory
cls_globalvariables.logList.Add("[" + now + "][" + logMessage + "]");
}
catch (Exception)
{ }
}
}
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
listBox1.DataSource = cls_globalvariables.logList;
}
}
但是,我僅在我的后台工作程序內部調用LOGS.LOG_PRINT,因此它在另一個線程中執行。 列表框將更新延遲到后台工作人員完成其過程為止。 我想念什么嗎?
您不應在后台線程中更新BindingList實例,因為您正在將其綁定到主用戶界面線程。 用戶界面控件並非旨在從創建它的線程之外的任何線程調用。
因此,我建議您的后台線程使用新消息回調主線程,然后主線程將該消息添加到綁定列表中。
將SynchronizationContext.Current從主線程傳遞到后台線程,然后在LOGS.LOG_PRINT方法內部,應使用lambda調用SynchronizationContext的Post方法來更新列表。 類似於以下內容...
_syncContext.Post((_) => cls_globalvariables.logList.Add(str), null);
其中str是新構造的日志記錄字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.