在 Twitch [C#] 中使用 IRC-Client 时 WPF-App 不可用

WPF-App unsuable when using IRC-Client in Twitch [C#]

我想设置我自己的具有漂亮用户界面的 TwitchBot。但是我 运行 遇到了一些麻烦:我对格式化感到抱歉,但它没有很好地从 Visual Studio 复制它,而且这里的格式化看起来很糟糕。

public class IrcClient
{
        private string userName;
        private string channel;

        private TcpClient tcpClient;
        private StreamReader inputStream;
        private StreamWriter outputStream;

        public IrcClient(string ip, int port, string userName, string password, string channel)
        {
            this.userName = userName;
            this.channel = channel;

            tcpClient = new TcpClient(ip, port);
            inputStream = new StreamReader(tcpClient.GetStream());
            outputStream = new StreamWriter(tcpClient.GetStream());

            outputStream.WriteLine($"PASS {password}");
            outputStream.WriteLine($"NICK {userName}");
            outputStream.WriteLine($"USER {userName} 8 * :{userName}");
            outputStream.WriteLine($"JOIN #{channel}");
            outputStream.Flush();
        }

        public string ReadMessage()
        {
            return inputStream.ReadLine();
        }
}

这是我的 class,我在其中设置了 IRC 客户端。然后我使用标准 WPF/C# build in Visual Studio with


        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
            System.Windows.Threading.DispatcherTimer dispatcherTimerChat = new System.Windows.Threading.DispatcherTimer();

            dispatcherTimerChat.Tick += new EventHandler(dispatcherTimerChat_tick);
            dispatcherTimerChat.Interval = new TimeSpan(500000);

            dispatcherTimerChat.Start();

            client = new IrcClient("irc.twitch.tv", 6667, "x", "x", "x");

            var pinger = new Pinger(client);
            pinger.Start();

        }

        private void dispatcherTimerChat_tick(object sender, EventArgs e)
        {
            Console.WirteLine(client.ReadMessage());
        }

Window_loaded 在加载主要 window 时被调用。在那里,我只想接收聊天中写的内容。但是 UI 非常滞后。当我将一些基本的东西放入 XAML 代码中时,比如 Richttextbox,我什至无法在没有可靠延迟的情况下写入。虽然降低 TimeSpan(x) 会有所帮助,但在人口合理的频道中阅读聊天内容就会出现问题。显然这里出了点问题,但我不知道是什么。

Pinger Class 每 5 分钟 ping 一次,这样我就不会被踢出频道并在自己的线程上运行。

这不是完整的代码,只是获取 WPF 表单的最低要求 运行 缺失。

感谢 aepot 的评论,我研究了异步编程。这个解决方案对我有用:

我添加了一个功能

private async Task<string> getChat()
{
    string msg = await Task.Run(() => client.ReadMessage());

    return msg;
}

并将调度程序功能更改为

private async void dispatcherTimerChat_tick(object sender, EventArgs e)
{
    string msg = await getChat();

    Console.WriteLine(msg);
}

这个 tutorial 一路帮助了我。