在 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 一路帮助了我。
我想设置我自己的具有漂亮用户界面的 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 一路帮助了我。