我有一个库,可以为名为MessageOut的函数生成字符串。此功能,我无法更改其结构。
它看起来像这样:
public void MessageOut(string msg) //params or return-type cannot be changed
{
Console.WriteLine(msg);
}
我的表单中有一个文本框,希望在其中显示此消息。
如何将msg
附加到该文本框?
我尝试过:
public void MessageOut(string msg) //params or return-type cannot be changed
{
Console.WriteLine(msg);
sendMessageTextBox(msg);
}
public string[] sendMessageTextBox(params string[] msg)
{
string send = "";
foreach(var i in msg){send = i;}
return send;
}
表格:
private void getWaveformBtn_Click(object sender, EventArgs e)
{
MyClass className = new MyClass();
foreach(var i in className.sendMessageTextBox())
{
errorTextBox.Text += i;
}
}
出于明显的原因,这不起作用,但是我不确定如何去做。 (我尝试过:how to send text to textbox through a different class?
Sending information to a textbox from a class to a form)
但是,我似乎无法获得这些解决方案。
非常感谢您的帮助。
TL; DR-我基本上想在文本框中显示messageOut
收到的新字符串
答案 0 :(得分:0)
这可以通过不同的方式来完成,其中之一是使用队列,从MessageOut
中填充队列,并在按下按钮时将其耗尽。
public class MessageHandler /* , MessageOutInterface */
{
private readonly Queue<string> messages;
public MessageHandler()
{
this.messages = new Queue<string>();
}
public void MessageOut(string message)
{
this.messages.Enqueue(message);
}
public IEnumerable<string> PendingMessages()
{
string message;
while (this.messages.Count > 0)
yield return this.messages.Dequeue();
}
}
您的用户界面代码
private void getWaveformBtn_Click(object sender, EventArgs e)
{
foreach(var i in messageHandler.PendingMessages())
{
errorTextBox.Text += i;
}
}
如果在一个线程(即不是主线程)上调用MessageOut
,并且显然在主线程上发生了按钮按下操作,则需要一种线程安全的方法:
public class MessageHandler /* , MessageOutInterface */
{
private readonly object syncRoot = new Object();
private readonly Queue<string> messages;
public MessageHandler()
{
this.messages = new Queue<string>();
}
public void MessageOut(string message)
{
lock (this.syncRoot)
{
this.messages.Enqueue(message);
}
}
public IEnumerable<string> PendingMessages()
{
lock (this.syncRoot)
{
var pending = this.messages.ToArray();
this.messages.Clear();
return pending;
}
}
}
这不是同步线程的最佳方法,但是您可以问另一个有关同步的问题。