在Microsoft Orleans中检查GUID是否存在颗粒
如何检查特定Id的颗粒是否已存在?
考虑到下面将创建一个新的播放器粒度与Id我传入GetGrain()如果它不存在,我不知道如何检查是否已经存在. public async Task<Guid> Create(Guid playerGuid) { var player = GrainClient.GrainFactory.GetGrain<IPlayerGrain>(playerGuid); var gameGuid = await player.CreateGame(); return gameGuid; } 解决方法
简短的回答是存储一些状态,以便谷物知道它是否先前已被激活.
奥尔良的谷物永远不会被明确地创建或销毁:它们始终可用于处理请求.因此,从技术上讲,谷物是否存在的概念并不适用于奥尔良.另一方面,我们可以问“有这个id的颗粒曾被激活过”. 您可能需要检查两种情况: >谷物从未被激活过,但你期待它已经被激活了.例如:我在IPlayerGrain上调用一个方法,但播放器不存在. 在下面的代码示例中,您可以看到两种情况: >如果之前从未创建过播放器,则对IPlayerGrain.CreateGame()的调用将抛出异常.忽略我永远不会设置Created的事实,可以在一些CreatePlayer(…)方法中完成. public interface IPlayerGrain : IGrainWithGuidKey { Task<Guid> CreateGame(); } public class PlayerState { public bool Created { get; set; } } public class PlayerGrain : Grain<PlayerState>,IPlayerGrain { public async Task<Guid> CreateGame() { if (!this.State.Created) throw new InvalidOperationException("Player does not exist."); var thisPlayer = this.AsReference<IPlayerGrain>(); var created = false; var gameId = default(Guid); while (!created) { // Get a new,random game grain gameId = Guid.NewGuid(); // Try to create a game. created = await this.GrainFactory.GetGrain<IGameGrain>(gameId) .TryCreateGame(thisPlayer); // If the game was successfully created,break out and return the id. // Otherwise,keep looping. } return gameId; } } public interface IGameGrain : IGrainWithGuidKey { // Returns true if game was created,false otherwise. Task<bool> TryCreateGame(IPlayerGrain player); } public class GameState { public IPlayerGrain Player { get; set; } } public class GameGrain : Grain<GameState>,IGameGrain { public async Task<bool> TryCreateGame(IPlayerGrain player) { // If this grain already has a player,return false. if (this.State.Player != null) return false; // Otherwise,set the player,write it to storage,and return true. this.State.Player = player; await this.WriteStateAsync(); return true; } } 您问题中的Create方法无需更改. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-phone-7 – 在WP7芒果中默认情况下列表框是否已虚拟
- windows-xp – 本地帐户的共享和安全模型:在域中使用此设置
- windows – 网络引导所有类型的操作系统
- Atitit webdav 的问题 -------------大文件传输问题 在某些
- windows-server-2008 – Windows Server 2008 R2打印服务器
- 如何在Windows上确定USB端口版本?
- windows – TPath.GetTempFileName回复“目录名无效”
- windows – 从服务启动的进程,CreateProcessWithLogonW立即
- windows-7 – Windows 7 Print Spooler服务不断停止
- iis-7 – Win 2008 R2上的IIS 7默认情况下不显示图像
- windows-phone-7 – 将文件扩展名与wp7.1中的app
- windows重启后浏览器无法上网的解决办法
- 如何在Windows 2003 Server中获取激活密钥
- windows下MongoDB的安装及配置
- HP ML350 Gen9安装Windows Server 2008 R2(官网文
- windows-phone-7 – 限制DatePicker中的日期范围
- Windows Phone 7导航动画
- windows-installer – Windows Installer属性中可
- windows-server-2008 – Active Directory用户和
- windows-server-2008 – 远程计算机补丁信息