簡體   English   中英

C#-將條目添加到單獨線程中的列表時,列表框未更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM