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
相关产品推荐
相关产品推荐

