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

标签 c# multithreading wcf windows-runtime monogame

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

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] 我试了一下。我用标准的 HTTP 请求替换了 Azure 移动服务客户端调用,它运行得非常好;没有迷你卡住。当然它还没有到后端,但至少我可以通过手动完成整个事情来解决这个问题。但是,我宁愿不这样做。

[更新 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);

太棒了...我可能应该重构整个问题。天快变干了。

最佳答案

我有一个关于如何在后台线程上运行的问题,他们建议我使用线程池,所以我建议你看看我的问题和答案,也许你可以了解一些事情并让它继续工作你的结局。

Create Backgroundthread Monogame

关于C# + WinRT + 用于网络(Azure 移动服务)操作的 Monogame 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19081531/

相关文章:

c# - 是否有用于 Silverlight 的现代版本 "Deep Zoom Composer"允许将全景图像拼接在一起?

c# - WCF 客户端证书身份验证,服务 'SslRequireCert' 的 SSL 设置与 IIS 'Ssl, SslNegotiateCert' 的设置不匹配

c# - Control.ControlCollection 问题

c# - 为什么 BCL Collections 使用结构体枚举器,而不是类?

python - 将输入从一个线程子进程发送到另一个线程子进程

iphone - 尽管使用多线程,但在 webview 中加载图像会阻塞主线程

java - 从 BlockingQueue 读取消息时出现延迟

c# - IQueryable Count 方法需要更长的时间来执行

c# - WCF 自托管通过 Https 失败

c# - 传递给 Web 服务请求时,日期时间字段未转换为 UTC 格式