【发布时间】:2018-06-12 19:43:56
【问题描述】:
我似乎无法找到有关如何执行此操作的可靠信息来源。我正在做的事情的细分。我有一个服务器/客户端正在运行,它在一个线程上运行。收到信息后,我需要将该信息放入标签中。
为了完全清楚,我想在标签中显示收到的消息。
我听课的代码:
public void receiveMessage(IAsyncResult ar)
{
//read from client
int bytesRead;
try
{
lock (_client.GetStream())
{
bytesRead = _client.GetStream().EndRead(ar);
//Console.WriteLine(ASCIIEncoding.ASCII.GetString(data, 0, bytesRead));
}
//if client has disconnected
if (bytesRead < 1)
return;
else
{
//get the message sent
string messageReceived =
ASCIIEncoding.ASCII.GetString(data, 0, bytesRead);
if (frmMain.InvokeRequired)
{
frmMain.UpdateData(messageReceived);
}
}
//continue reading from client
lock (_client.GetStream())
{
_client.GetStream().BeginRead(
data, 0, _client.ReceiveBufferSize,
receiveMessage, null);
}
}
catch (Exception ex)
{
}
}
来自 frmMain.UpdateData 的代码:
public void UpdateData(string text)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(UpdateData), new object[] { text });
return;
}
stat_bar.Text = text;
}
这在普通桌面 win 表单应用程序上运行良好。但我需要在 WindowsCE/.NetCompact 框架内进行一些工作。
【问题讨论】:
-
那个答案让我在 else {} 中更新,当我这样做时它会跳过 else 语句。有什么提示吗?
-
您是否尝试使用
delegate调用它?private delegate void UpdateDataDelegate(string text);和this.Invoke(new UpdateDataDelegate(UpdateData), text); -
我还想知道
new object[] { text }是否是您方法的有效参数,因为Invoke的第二个参数是params object[] args,这让我认为UpdateData正在接收object[] { object[] { text } }.如果在stat_bar.Text = text;行中设置断点,它会命中吗?
标签: c# .net compact-framework windows-ce