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

C#异步方法内赋值类实例跨方法访问为null如何修复

问题原因

出现decoded取值为null的核心原因是你赋值和取值操作的是两个完全独立的Form1实例,二者没有任何关联:

  • 静态方法_MainAsync内部通过new Form1()创建了一个局部作用域的临时窗体对象info,你给info.decoded的赋值仅作用在这个临时对象上,方法执行结束后这个临时对象就会被垃圾回收,根本不会影响你正在交互的那个窗体。
  • 按钮点击事件button1_Click中直接读取的decoded,是当前用户正在操作的窗体实例(即this.decoded)的成员,这个成员从来没有被赋过值,默认就是null。
修复方法

选任意一种方案修改即可,两种方案都能保证赋值和读取的是同一个对象的成员:

方案1:去掉静态方法里的临时实例创建,直接操作当前窗体成员

把_MainAsync的static修饰符去掉,删掉方法内新建Form1实例的代码,直接给当前实例的decoded赋值:

async Task _MainAsync()
{
    // 原有获取msg的逻辑保留
    // 删除 Form1 info = new Form1(); 这行错误的新建实例代码
    decoded = JsonConvert.DeserializeObject<Rootobject>(msg);
}

按钮点击事件补充简单判空即可,避免反序列化失败导致空引用报错:

private async void button1_Click(object sender, EventArgs e)
{
    await _MainAsync();
    if (decoded != null)
    {
        coin.Text = decoded.message;
    }
}

方案2:保留静态方法,将反序列化结果作为返回值回传

如果业务上需要保留_MainAsync的静态属性,就不要在静态方法里操作窗体实例,直接把反序列化得到的结果返回给调用方:

static async Task<Rootobject> _MainAsync()
{
    // 原有获取msg的逻辑保留
    var result = JsonConvert.DeserializeObject<Rootobject>(msg);
    return result;
}

在按钮点击事件中接收静态方法的返回值,赋值给当前窗体实例的decoded成员:

private async void button1_Click(object sender, EventArgs e)
{
    decoded = await _MainAsync();
    if (decoded != null)
    {
        coin.Text = decoded.message;
    }
}

注意:不要在静态方法中随意创建UI窗体类的实例,这类通过new创建的窗体实例没有被加载激活,和用户实际看到、正在操作的窗体是完全隔离的,对新实例做的任何属性修改、控件操作都不会反映到正在运行的界面上。

内容的提问来源于stack exchange,提问作者Rostislav Palanevich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:03:19