Синтаксис C#

программирование обучение C#

Имеется форма для вывода прогресса, созданная в основном потоке. Информацию о том, что надо вывести прогресс дает дочерний поток, так вот использую Invoke для доступа к ProgressBar-у из основного потока
public void SetProgress(int perc)
{
if (progressBar1.InvokeRequired) { this.Invoke(SetProgress,new object[] {perc}); }
else { progressBar1.Value = perc; }
}
Ругается на "this.Invoke(SetProgress,new object[] {perc});":
Argument '1': cannot convert from 'method group' to 'System.Delegate'

А если создать делегат с такой же сигнатурой как у SetProgress:
private delegate void SetProgressDelegate(int perc);
и вызвать Invoke так:
this.Invoke(new SetProgressDelegate(SetProgress),new object[] {perc});
то все OK.
Так вот вопрос: как-то короче можно сделать запись, что бы уйти от объявления делегата SetProgressDelegate?

Ответы:
Можно. С помощью встроенного делегата Action<T>.
Например, так:
void SetProgress(Int32 perc)
{
if (this.InvokeRequired)
Invoke
(
(Action<Int32>)delegate(Int32 percent)
{
// Тут код.
}
);
}


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.