gpt4 book ai didi

C# - 为高端服务器使用异步

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:46 24 4
gpt4 key购买 nike

我不确定对我打算做的事情使用异步是否是最有效的方式,所以我决定问问你们对此有何看法。

背景故事:我正在为一款 MMORPG 游戏开发服务器模拟软件,该游戏的世界中有 NPC。您(客户端)可以通过对话与 NPC 互动。对话框向玩家显示文本以及选项(一些对话框是是/否对话框、接受/拒绝等)。

我决定使用 C# 作为 NPC 脚本的脚本接口(interface)。当服务器启动时,它会为每个 NPC 编译并保存已编译脚本的程序集,当玩家与其中之一交谈时,它会执行所需的脚本。

现在,假设用户必须向服务器提供输入。首先,我们显示一个带有是/否问题的窗口。

客户端显示如下:

“你想收到一个苹果吗?”是/否

脚本在发送对话后停止,直到它使用异步从客户端收到响应。发送对话框的方法返回 bool 任务(true 表示是,false 表示否)并且是异步的。响应是一种 bool 型的 TaskCompletionSource。所以,方法是这样的:

TaskCompletionSource<bool> _response; 

public async Task<bool> SendDialog()
{
_response = new TaskCompletionSource<bool>();
[... the packet that shows the dialog]
return await _response.Task;
}

因此,如您所见,它会一直等待,直到设置了响应,然后才返回它。

一旦服务器收到响应数据包,它就会根据输入设置响应。

_response.SetResult(...);

然后脚本继续(因为输入已经给出)。

现在,我想问问大家,高端服务器的效率如何,是否可以通过某种方式进行改进?还是有另一种方法可以暂停脚本直到给出输入?

最佳答案

这种方法具有很好的权重和效率,因为它是专门为这些类型的高级任务设计的:GUI 交互、高级业务逻辑、并行任务、任务链等。

虽然它在低级应用程序中使用时效率不高,例如具有较小内存占用的 I/O 操作、系统调用、高粒度任务等。

顺便说一句,看看你的例子,我可以看到那里有一个不必要的等待。您可以改为简化:

TaskCompletionSource<bool> _response; 

public Task<bool> SendDialog()
{
_response = new TaskCompletionSource<bool>();
// [... the packet that shows the dialog]
return _response.Task;
}

根据定义,async 方法只是编译器生成的任务。由于您在此处使用了 TaskCompletionSource,因此您已经在手动生成任务。无需将其包装在另一个(编译器生成的)任务中。

关于C# - 为高端服务器使用异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799201/

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