Межпотоковая операция недопустима после изменения локальной переменной на свойство и используется в .ContinueWith (), когда F () вызывается в конструкторе? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть свойство, возвращающее выбранный элемент группы радиоблоков.

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' осуществляется из потока, отличного от потока, в котором он был создан.

Обновление: Я нашел всекод работает, если не вызывается из конструктора.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Разница в том, что когда b является свойством, его геттер вызывается внутри ContinueWith, и этот геттер обращается к CB.SelectedItem

Если вместо этого вы выполняете метод получения внутри F(), а затем используете результат в ContinueWith, он должен быть функционально идентичен вашему первому примеру

async Task F() {
    var a = b; //invokes CB.SelectedItem in the UI thread
    var t1 = callAsync().ContinueWith(x => {
        if (a) { /*... }
    });
0 голосов
/ 08 марта 2019

Мое предложение будет примерно таким:

if (control.InvokeRequired())
{
  control.BeginInvoke();
}

Вы можете проверить Метод или метод расширения для обработки InvokeRequired .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...