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

我有一个属性返回一个单选框组的选定项。


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”从创建它的线程以外的线程访问。


更新: 如果不是从构造函数调用,我发现所有代码都有效。


牛魔王的故事
浏览 78回答 1
1回答

青春有我

不同之处在于 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) { /*... }    });
打开App,查看更多内容
随时随地看视频慕课网APP