C# 调用在 UI 线程上运行的委托

本文关键字:运行 线程 调用 UI | 更新日期: 2023-09-27 17:57:02

我在线程和 UI 代码方面遇到问题。我想要一个深度嵌套的子类来调用 ui 更改,写入文本框。这来自一个新线程。背景是我有一个服务器类,错误通知可以从不同线程上的不同客户端触发。我希望所有通知都位于同一个文本框中。我已经大大简化了代码以帮助调试,但我已经验证了它重现了错误。文本框中仅显示"hello2",但我也想要"hello1"。

using System.Threading;
using System.Windows;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
    ehcontainer ehc;
    public MainWindow()
    {
        InitializeComponent();
        ehc = new ehcontainer();
        ehc.eh.em.Notifier = WriteToTextBox;
    }
    // Attempting to only run from UI thread
    private void WriteToTextBox(string message)
    {
        if (!log_TextBox.CheckAccess())
        {
            Dispatcher.Invoke(() => apptext(message));
            return;
        }
        apptext(message);
    }
    private void apptext(string message)
    {
        log_TextBox.AppendText(message + "'n");
    }
    // Only hello2 is written to text box
    private void button_Click(object sender, RoutedEventArgs e)
    {
        ehc.NewWriteThread("hello1");
        ehc.Write("hello2");
    }
}
public class ehcontainer
{
    public errorhandler eh = new errorhandler();
    public void NewWriteThread(string message)
    {
        ehcontainer tempEHC = new ehcontainer();
        Thread newThread = new Thread(tempEHC.Write);
        newThread.Start(message);
    }
    public void Write(object obj)
    {
        string sMessage = (string)obj;
        eh.em.Notify(sMessage);
    }
}
public class errorhandler
{
    public errormessenger em;
    public errorhandler()
    {
        em = new errormessenger();
    }
}
public class errormessenger
{
    public delegate void NotifyMethod(string message);
    private NotifyMethod myNotifyMethod = null;
    public NotifyMethod Notifier
    {
        get { return myNotifyMethod; }
        set { myNotifyMethod = value; }
    }
    // Run a delegate that calls some notification function in UI thread
    public void Notify(string message)
    {
        myNotifyMethod?.Invoke(message);
    }
}
}

C# 调用在 UI 线程上运行的委托

尝试在log_TextBox上设置TextWrapping="Wrap"AcceptsReturn="True"

您的errormessenger没有Notifier。为什么?关键是您在调用ehcontainer.NewWriteThread时要创建一个新ehcontainer - 并且您永远不会将旧容器中的Notifier分配给新容器。

如何解决这个问题完全取决于你的逻辑。我不知道你想做什么,以及你为什么特别选择这个解决方案来做这件事。例如,为什么您使用 C# 6 功能,却选择使用 Thread 而不是 Task