我有嵌入式 C 背景,正在开发我的第一个 C# 应用程序,但我在这方面遇到了障碍,而且我的研究没有成功,所以我想我应该在这里问。
到目前为止,简单的应用程序。我有一个 MainWindow,除了一堆其他东西之外,还可以在单击按钮时启动 TCPClient 线程:
public partial class MainWindow : Window
{
....
TCPConnection myCon = new TCPConnection();
....
private void connectButton_Click(object sender, RoutedEventArgs e)
{
networkListBox.Items.Add("Connecting...");
myCon.Connect("localhost", updateNetworkListBox);
}
}
....
public void updateNetworkListBox(string message)
{
networkListBox.Items.Add(message);
}
在 TCPConnection.cs 中:
public class TCPConnection
{
....
public void Connect(string server, ReportDelegate reportDelegate)
{
this.server = server;
clientThread = new Thread(() => Client(this.server));
clientThread.Start();
reportDelegate("Started client thread...");
}
static void Client(string server)
{
try
{
Int32 port = 25565;
TcpClient client = new TcpClient(server, port);
Byte[] outgoingBytes = new Byte[1024];
string outgoingString = "Hello! I am " + Guid.NewGuid();
outgoingBytes = System.Text.Encoding.ASCII.GetBytes(outgoingString);
NetworkStream stream = client.GetStream();
stream.Write(outgoingBytes, 0, outgoingBytes.Length);
stream.Close();
client.Close();
}
既然 TCP 连接可以工作,我想做的第一件事就是向 UI 发送一条消息,例如“客户端线程连接...”、“客户端线程连接...”,并将其显示在网络列表框中。
在 Connect() 方法中,我可以通过使用委托来完成此操作,但这显然在新线程中不起作用,因为无法从另一个线程直接访问 UI 控件。
我已经阅读了大量有关此的文章,并且我知道我可能想使用调度程序来执行此操作。然而,我见过的几乎所有示例都在当前类中创建了一个新线程,例如,将匿名方法传递给 Dispatcher.Invoke()。
有一个例外this提倡使用 EventHandler 并在主窗口中初始化它的讨论。这似乎不太理想,但也许我错了。
再往下,还有人提倡数据共享。同样,这对我来说似乎不太理想。
我读过的其他文章似乎已经过时了。
因此,我欢迎任何有关如何解决此问题的解释。可能我只是在语法上感到困惑,但我怀疑,尽管我认为我对委托、lambda 等大部分内容都很清楚,但我可能对到底需要完成什么感到困惑。
如果您能通过一些解释来展示如何在这个特定示例中完成它,我将不胜感激。
也许还有一些对我来说有点模糊的具体问题:
1) 我的工作任务可以单独访问它还是必须由 UI 的调度程序提供?
2) UI 是否应该提供执行调度的委托,或者是否应该在工作任务中对调度进行编码,引用 UI Dispatcher?
非常感谢。