为了账号安全,请及时绑定邮箱和手机立即绑定

当在构造函数中调用 F() 时,将局部变量更改为属性并在 .ContinueWith() 中使用后

当在构造函数中调用 F() 时,将局部变量更改为属性并在 .ContinueWith() 中使用后

C#
牛魔王的故事 2022-10-15 14:59:55
我有一个属性返回一个单选框组的选定项。public string P1 { get => CB.SelectedItem as string; }它用于在类的构造函数中调用的异步函数中。async Task F() {    var b = P1?.Equals(".........", StringComparison.InvariantCultureIgnoreCase) ?? false;    var t1 = callAsync().ContinueWith(x => {        if (b) { .../* use x*/... }    });    await t2;    await t1; //...代码工作正常。但是,b在很多地方都使用了,所以我为它创建了一个属性并删除了局部变量var b = P1?Equals(....。bool b => P1?.Equals(".........", StringComparison.InvariantCultureIgnoreCase) ?? false;async Task F() {    var t1 = callAsync().ContinueWith(x => {        if (b) { .../* use x*/... } // Exception if F() is called in constructor    });    await t2;    await t1; //...现在访问时出现以下错误CB.SelectedItem?跨线程操作无效:控件“CB”从创建它的线程以外的线程访问。更新: 如果不是从构造函数调用,我发现所有代码都有效。
查看完整描述

1 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

不同之处在于 whenb是一个属性,它的 getter 是在内部调用的ContinueWith,而那个 getter 访问CB.SelectedItem


相反,如果您在里面执行getter F(),然后在里面使用结果ContinueWith,它应该在功能上与您的第一个示例相同


async Task F() {

    var a = b; //invokes CB.SelectedItem in the UI thread

    var t1 = callAsync().ContinueWith(x => {

        if (a) { /*... }

    });


查看完整回答
反对 回复 2022-10-15
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信