C# + WinRT + 用于网络(Azure 移动服务)操作的单游戏线程

本文关键字:操作 单游戏 线程 游戏 移动 用于 WinRT 网络 Azure 服务 | 更新日期: 2023-09-27 18:33:17

我的应用程序中有一个循环,它以以下方式循环遍历一组实体

foreach(var entity in mEntities)
{
    entity.Update();
}

其中一些实体维护一个网络组件,该组件将调用 Azure 移动服务,以便将其状态更新到服务器。下面是一个示例:

public class TestEntity {
    public int Index;
    public int PropertyValue;
    public async void Update()
    {
        Task.Run(() => {
            MyAzureMobileServiceClient.Update(Index, PropertyValue);
        });
    }
}

UI渲染由Monogame以更传统的游戏循环方式完成。虽然我不知道它的内部工作原理,但我相当确定它没有实际的单独线程来完成这项工作。实际上,这显示为每次调用此更新时 UI 冻结。

我希望能够在后台"顺利"运行它。在旧的 Windows 模型中,这可以通过启动一个可以处理它的新线程轻松完成,但我对 WinRT 中的线程了解得不够好,无法理解我的方法有什么问题。

有什么想法吗?

[更新] 我也试过这个:

Task.Factory.StartNew(async () =>
{
    while(true) {
        await Task.Delay(1000);
        MyAzureMobileServiceClient.Update(Index, PropertyValue);
    }
});

每隔 1 秒,我就会像以前一样得到一个迷你冻结。

[更新2] 我试了一下。我将 Azure 移动服务客户端调用替换为标准 HTTP 请求,它运行良好;没有迷你冻结。当然,它还没有到后端,但至少我可以通过手动完成整个事情来解决问题。但是,宁愿不这样做。

[更新3] 这越来越奇怪了。我意识到我简化了这个问题中的代码,以使其在上下文中保持一致。但是,这似乎已经消除了问题的真正根源。我尝试了以下方法:

  1. 我创建了一个HTTP请求并手动创建了请求,在Task.Run((中调用了它,它运行良好,没有延迟。
  2. 我直接调用了 Azure 移动服务客户端更新,没有延迟。

因此,这让我想到了问题所在。我基本上有一个用于 Azure 移动服务的包装类。真正的路径大致如下所示:

CommunicationClient.UpdateAsync(myObject);
public Task UpdateAsync(MyObjectType obj)
{
    var table = mMobileServiceClient.GetTable<MyObjectType>();
    return table.UpdateAsync(obj);
}

这会导致滞后,但是如果我这样做而不是它,它可以没有任何延迟:

var client = CommunicationClient.MobileServiceClient;
var table = client.GetTable<MyObjectType>();
table.UpdateAsync(obj);

所以。。。我可能应该重构整个问题。它越来越干了。

C# + WinRT + 用于网络(Azure 移动服务)操作的单游戏线程

我有一个关于如何在后台线程上运行的问题,他们建议我使用 ThreadPool,所以我建议你看看我的问题和答案,也许你可以拿起一些东西并让它在你的最后工作。

创建背景线程单博