Как извлечь Invoke вызов метода с лямбда-параметром - PullRequest
0 голосов
/ 06 апреля 2020

Я пишу множество таких программ для обновления потока пользовательского интерфейса из BackgroundWorker (_instance - ссылка на класс Main):

_instance.Invoke((Action)(() =>
{
    _instance.DgvResults.DataSource = Results;
    _instance.LblStatus.Text = @"Done!";
}));

Я хотел бы извлечь этот блок в метод так что я могу назвать это так:

RunOnUIThread(() => _instance.DgvResults.DataSource = Results);

Другими словами, цель состоит в том, чтобы передать этому методу лямбду, содержащую инструкцию, которую я хочу запустить в потоке пользовательского интерфейса. Я смог сделать это в Java, но я все еще плохо знаком с C# и не знаю, как с этим справиться. Любое руководство будет оценено.

1 Ответ

0 голосов
/ 06 апреля 2020

Я не уверен, что это то, что вы хотите, но я думаю, что вы можете использовать event делегат.

// In UI-related code
public event Action UpdateUI;

И вы можете добавлять лямбды, которые вы хотите вызывать, когда что-то изменилось.

// Other codes
_uiCode.UpdateUI += () => _instance.DgvResults.DataSource = Results;

// More other codes
_uiCode.UpdateUI += () => UpdateSomethingTopPanel();
_uiCode.UpdateUI += () => UpdateSomethingBelow();
...

И вызывать эти функции через однострочный код:

// If nothing has added to event, invoking would cause nullref, 
// so we have to check null.
UpdateUI?.Invoke();

Но будьте осторожны, добавление чего-либо в event не проверяет дубликат члена. Вы должны позвонить по вышеуказанному коду только один раз.

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