【问题标题】:Pasting tcpstream input to a textbox将 tcpstream 输入粘贴到文本框
【发布时间】:2016-01-06 17:05:38
【问题描述】:

所以我已经有一段时间了。

到达流的末尾程序会冻结,直到有新的输入才再次冻结。

使用线程我得到了我无法从该线程访问文本框的异常。 backgroundworker 只是什么都不做。

我真的有点迷路了

我的代码有点像这样

在管理 tcp 流的类中: 字符串读取消息() { 返回 inputStream.ReadLine() }

在我的 windows 窗体类中,我需要以某种方式不断使用输入流更新文本框而不冻结 ui

【问题讨论】:

  • 没有人可以帮助您解决这个问题,因为我们不知道您在说什么。给我们看一些代码,描述你想要做什么,问一个问题......
  • 假设您使用的是 WinForms,如果您想从创建 UI 组件的线程以外的线程更改 UI 组件的状态,则需要使用 Invoke(Delegate 方法)。您可以使用 InvokeRequired 来检查是否需要使用 Invoke()
  • 啊该死的格式删除了我的代码
  • 所以我得到了我的方法“irc.readMessage()”,它从 tcp-streamreader 返回一个字符串。我在我的 WindowsForm 类中得到了我的线程“t”我将如何使用这个调用将 readmessage 方法中的文本附加到我的文本框?
  • 这还不够,但使用类似这样的东西 - Invoke(new MethodInvoker(() => action()));操作是您尝试更改文本框中文本的任何代码。

标签: c# multithreading tcp backgroundworker streamreader


【解决方案1】:
public string readMessage()
    {
        string message;
        message = inputStream.ReadLine();
        return message;
    }

这就是处理 tcp 流的东西

现在在我的主表单类中,它看起来像这样:

void Refresh(object sender, EventArgs e)
    {
        Thread.Sleep(1000);
        n+=1;
        label1.Text = Convert.ToString(n);
    }

    public void update()
    {
        Channel.AppendText(irc.readMessage());
    }
    void WORK()
    {
        while(true)
        {
            Channel.Invoke(new MethodInvoker(() => update()));
        }
    }

Work 是线程调用的方法,而 refresh 是定时器调用的方法,它定期将主线程设置为休息,以便其他线程可以完成它的工作

让它运行...直到它到达当前流的末尾并再次冻结,直到流中有一个新输入,它快速写入文本框并再次冻结,这正是我所做的不想。

编辑:我设法让它与 tcp.SenderTimeout 一起工作,将超时设置为几毫秒,并且每秒只更新一次聊天,但它仍然感觉真的没有响应。 有没有办法让它在后台运行更流畅?因为我还必须在运行时工作并响应输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多