我遇到线程和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);
}
}
}
答案 0 :(得分:0)
尝试在log_TextBox上设置TextWrapping="Wrap"
和AcceptsReturn="True"
。
答案 1 :(得分:0)
您的errormessenger
没有Notifier
。为什么?关键是您在调用ehcontainer
时创建了新的ehcontainer.NewWriteThread
- 并且您从未将旧容器中的Notifier
分配给新容器。
如何解决这个问题完全取决于你的逻辑。我不知道你要做什么,为什么你特别选择这个解决方案呢。您为什么使用C#6功能,但是选择使用Thread
代替Task
?