我有一个属性返回一个单选框组的选定项。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) { /*... }
});
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报
0/150
提交
取消