You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:55:16