c # делегат: я использую это правильно? - PullRequest
2 голосов
/ 03 октября 2010

Я впервые использую делегат в приложении c #. Кто-нибудь может проверить, правильно ли я это использую.

int totalsales = 0;

adddata(){ 
........ 
BeginInvoke(new UpdateSalesDelegate(UpdateSales), numbersale);

}

private delegate void UpdateSalesDelegate(int  args);

private void UpdateSales(int args){ 
totalsales = totalsales + args; 
Label.Text = "Total Sales: " + totalsales.ToString();

}

или я должен использовать

    adddata(){ 
    ........ 
    BeginInvoke(new UpdateSalesDelegate(UpdateSales), new int numbersale);

    }
.................

какой путь правильный?

Ответы [ 3 ]

1 голос
/ 03 октября 2010

Вы можете использовать действие делегат. Это избавляет вас от необходимости указывать свой собственный делегат каждый раз.

void AddData()
{
    BeginInvoke(new Action<int>(UpdateSales), numbersale);
}    

void UpdateSales(int args)
{

}
1 голос
/ 03 октября 2010

Если честно, я бы просто использовал

BeginInvoke((MethodInvoker)delegate {
    UpdateSales(numbersale);
});

Таким образом:

  • не нужно объявлять тип делегата
  • проверка статического типа
  • MethodInvoker имеет специальное обнаружение / обработку, поэтому немного быстрее (не намного)

Также не ясно, что будет делать асинхронный метод;добавление двух чисел является излишним, пример ели.Вам может потребоваться учитывать безопасность потоков и их сродство.

0 голосов
/ 03 октября 2010
Label.Text = "Total Sales: " + totalsales.ToString(); 

Скорее всего, этот код завершится ошибкой, поскольку BeginInvoke() вызывает делегат асинхронно в новом потоке, а обновление свойств в Label необходимо выполнить в потоке пользовательского интерфейса.

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