使用Discord Game SDK在C#中设置Rich Presence时遇TransactionAborted错误
解决Discord Game SDK C#版TransactionAborted错误
核心问题:缺少持续的回调处理循环
你的代码里仅调用了一次discord.RunCallbacks(),但Discord SDK需要持续、周期性地处理IPC通信和回调,单次调用无法完成UpdateActivity的完整RPC流程——这就是SDK未发送SET_ACTIVITY命令、最终返回TransactionAborted的根本原因。
修复步骤
- 添加持续的回调处理循环:必须在程序运行期间反复调用
RunCallbacks(),确保SDK能和Discord客户端完成完整的通信交互。 - 调整
CreateFlags(可选):若你的应用依赖Discord客户端运行,移除NoRequireDiscord标志,改用默认的CreateFlags.None,避免客户端存在时的通信异常。
修复后的完整代码示例
using System; using System.Threading; using Discord; class Program { static void Main(string[] args) { ulong clientID = 你的应用ID; // 替换为Discord开发者门户注册的应用ID bool isRunning = true; // 初始化Discord实例,建议使用默认标志 using var discord = new Discord(clientID, (UInt64)CreateFlags.None); var activityManager = discord.GetActivityManager(); // 构建Rich Presence活动 var activity = new Activity { State = "Foo", Details = "Bar", Timestamps = new ActivityTimestamps { Start = DateTimeOffset.UtcNow.ToUnixTimeSeconds() // 可选:添加活动开始时间 } }; // 更新Rich Presence activityManager.UpdateActivity(activity, result => { Console.WriteLine($"更新结果: {result}"); if (result != Result.Ok) { Console.WriteLine($"错误详情: {result}"); } }); // 持续处理回调的主循环 while (isRunning) { try { discord.RunCallbacks(); Thread.Sleep(1000 / 60); // 保持约60fps的回调处理频率 } catch (Exception ex) { Console.WriteLine($"回调处理异常: {ex.Message}"); isRunning = false; } } } }
额外排查点
- 确保Discord客户端为最新版本:旧版客户端可能与SDK存在IPC通信兼容性问题。
- 验证应用ID完全正确:复制时不要包含多余空格或字符,Discord客户端返回200仅代表ID验证通过,不代表后续通信无异常。
- 匹配SDK与客户端版本:尽量使用Discord开发者门户提供的、与当前客户端版本对应的Game SDK。
内容的提问来源于stack exchange,提问作者user18686221
相关产品推荐
相关产品推荐

