如何在C# Google Gemini中保持会话状态并检查会话是否激活?
解决Google Gemini会话丢失、未赋值变量及会话状态检查问题
一、解决每次点击按钮新建会话丢失聊天记录的问题
原因是每次点击按钮时,ChatSession对象都是方法内的局部变量,方法执行完毕后就会被销毁,聊天记录无法保留。解决方案是将ChatSession声明为类级别的字段,让它在整个类的生命周期内存在,每次点击按钮复用同一个会话。
修改后的代码示例:
// 在类内部声明类级别的字段 private GenerativeModel _geminiModel; private ChatSession _chatSession; // 窗体/类的构造函数 public YourFormName() { InitializeComponent(); // 仅初始化一次模型 var apiKey = Environment.GetEnvironmentVariable("Gemini_API_Key", EnvironmentVariableTarget.User); _geminiModel = new GenerativeModel(apiKey); } async private void Button1_Click(object sender, EventArgs e) { // 会话未初始化则创建,否则复用已有会话 if (_chatSession == null) { _chatSession = _geminiModel.StartChat(new StartChatParams()); } var result = await _chatSession.SendMessageAsync("Write poetry"); Console.WriteLine(result); }
这样每次点击按钮都会复用同一个_chatSession,聊天记录会自动保留在会话的History属性中。
二、解决“use of unassigned local variable 'chate'”错误
这个错误是因为局部作用域内的变量未被初始化就使用,编译器无法保证变量在所有代码路径中都被赋值。
采用上面的类级别字段方案可彻底解决该问题,因为_chatSession会在类构造或第一次点击时完成初始化,后续使用时必然已赋值。如果一定要使用局部变量,需确保变量在所有可能的代码路径中都被初始化:
async private void Button1_Click(object sender, EventArgs e) { var apiKey = Environment.GetEnvironmentVariable("Gemini_API_Key", EnvironmentVariableTarget.User); var model = new GenerativeModel(apiKey); // 先给变量赋默认值 ChatSession chat = null; // 无论条件分支如何,都确保变量被初始化 if (someCondition) { chat = model.StartChat(new StartChatParams()); } else { chat = model.StartChat(new StartChatParams() { /* 自定义参数 */ }); } var result = await chat.SendMessageAsync("Write poetry"); Console.WriteLine(result); }
三、检查C# Google Gemini聊天会话是否处于激活状态
Google Gemini的ChatSession没有直接提供“激活状态”的属性,可通过以下方式判断:
- 检查会话对象是否存在:如果
_chatSession不为null,说明会话已创建; - 维护自定义状态标记:在创建会话时标记为激活,捕获到会话相关异常时标记为失效;
- 发送测试消息验证:通过尝试发送测试消息并捕获异常,判断会话是否可用。
示例代码(自定义状态标记+异常捕获):
private bool _isChatActive; async private void Button1_Click(object sender, EventArgs e) { if (_chatSession == null) { _chatSession = _geminiModel.StartChat(new StartChatParams()); _isChatActive = true; } try { var result = await _chatSession.SendMessageAsync("Write poetry"); Console.WriteLine(result); } catch (Exception ex) { _isChatActive = false; Console.WriteLine("会话失效:" + ex.Message); } } // 检查会话状态 private bool CheckChatSessionStatus() { return _chatSession != null && _isChatActive; }
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

