使用 StreamReader 运行 会使应用程序无响应
Having a StreamReader running makes the application unresponsive
我有一个连接到 IRC 频道并使用 StreamReader 阅读聊天的机器人。一切正常,机器人可以读取和响应,但问题是 Windows 表单在 StreamReader 处于活动状态时冻结。
while(true)
{
string message = irc.readMessage();
if (message.Contains("!test"))
{
irc.sentChatMessage("answer");
}
}
我尝试将它放在计时器上,而不是每 100 毫秒滴答一次且没有任何变化的 while 循环。
方法
public string readMessage()
{
string message = inputStream.ReadLine();
return message;
}
这是因为 inputStream.ReadLine();
阻塞了 UI 线程。如果您使用异步重载 StreamReader.ReadLineAsync
这将 运行 异步,因此不会阻塞 UI 线程。
样本:
async void StartBot()
{
while(true)
{
string message = await irc.readMessageAsync();
if (message.Contains("!test"))
{
irc.sentChatMessage("answer");
}
}
}
public async Task<string> readMessageAsync()
{
string message = await inputStream.ReadLineAsync();
return message;
}
您可以找到更多信息以及有关 async 和 await 的示例 here。
我有一个连接到 IRC 频道并使用 StreamReader 阅读聊天的机器人。一切正常,机器人可以读取和响应,但问题是 Windows 表单在 StreamReader 处于活动状态时冻结。
while(true)
{
string message = irc.readMessage();
if (message.Contains("!test"))
{
irc.sentChatMessage("answer");
}
}
我尝试将它放在计时器上,而不是每 100 毫秒滴答一次且没有任何变化的 while 循环。
方法
public string readMessage()
{
string message = inputStream.ReadLine();
return message;
}
这是因为 inputStream.ReadLine();
阻塞了 UI 线程。如果您使用异步重载 StreamReader.ReadLineAsync
这将 运行 异步,因此不会阻塞 UI 线程。
样本:
async void StartBot()
{
while(true)
{
string message = await irc.readMessageAsync();
if (message.Contains("!test"))
{
irc.sentChatMessage("answer");
}
}
}
public async Task<string> readMessageAsync()
{
string message = await inputStream.ReadLineAsync();
return message;
}
您可以找到更多信息以及有关 async 和 await 的示例 here。