gpt4 book ai didi

sockets - ConnectAsync 阻塞 UI 线程

转载 作者:可可西里 更新时间:2023-11-01 02:43:52 26 4
gpt4 key购买 nike

我有一个简单的 WinRT 应用程序,它将通过 TCP 与远程服务器通信。

为了做到这一点,我正在创建新的 StreamSocket 对象,并在单击适当的按钮后连接到远程服务器,如下所示:

private async void ConnectButtonClick(object sender, RoutedEventArgs e)
{
StreamSocket socket = new StreamSocket();
HostName host = new HostName("192.168.1.15");
await socket.ConnectAsync(host, "12121");
}

问题是这段代码阻塞了 UI 线程。我创建了简单的动画,使用连续在屏幕上运行的 MonoGame(几个移动的 Sprite ),以检查 UI 是否被阻塞。

问题是,点击“连接”按钮后,动画会卡住一秒钟,所以我假设,连接到服务器是在 UI 线程中进行的。

我应该将我的整个网络代码放在一个单独的线程中,还是这个 async/await 就足够了?

我想实现一个循环,它将处理传入的数据(在 DataReader 的帮助下),如下所示:

private async void ReceiveLoop()
{
bool running = true;

while (running)
{
try
{
uint numStrBytes = await _reader.LoadAsync(BufferSize);

if (numStrBytes == 0)
{
Disconnect();
return;
}

string msg = _reader.ReadString(numStrBytes);

OnLog(string.Format("Received: {0}", msg));
OnDataReceived(msg);
}
catch (Exception exception)
{
OnLog("Receive failed with error: " + exception.Message);

Disconnect();
running = false;
}
}
}

发送数据将使用 DataWriter 中的 StoreAsync 完成。

那么我应该把这些函数放在单独的线程中吗?

最佳答案

您不能尝试在后台线程上执行此操作以查看是否有帮助吗?像这样:

Task.Run(
async () =>
{
StreamSocket socket = new StreamSocket();
HostName host = new HostName("192.168.1.15");
await socket.ConnectAsync(host, "12121");
});

关于sockets - ConnectAsync 阻塞 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com