Вы говорите, что значение ticketPrice
остается нулевым, но код не показывает место, где вы читаете значение переменной!
Такое поведение имело бы смысл, если бы оно использовалось в каком-то коде, который следует за опубликованным вами фрагментом. E.g.:
double ticketPrice;
LoadOperation loGetTickets = ticketClass.loadTickets();
loGetTickets.Completed += (s, args) => {
// Set value of 'ticketPrice'
ticketPrice = ...
};
// Use the value of the variable
Console.WriteLine(ticketPrice); // (*)
Это не работает, потому что строка, помеченная как (*)
, на самом деле завершает до , значение переменной устанавливается в обработчике Completed
. Чтобы заставить его работать, вам нужно переместить код, который использует переменную, в обработчик (после кода, который устанавливает значение переменной).
Тогда, конечно, не имеет смысла объявлять переменную в методе, потому что она будет использоваться только в теле лямбда-функции, так что вы получите что-то вроде этого:
LoadOperation loGetTickets = ticketClass.loadTickets();
loGetTickets.Completed += (s, args) => {
double ticketPrice;
// Set value of 'ticketPrice'
ticketPrice = ...
// Use the value of the variable
Console.WriteLine(ticketPrice); // (*)
};
Полагаю, вы только что обнаружили болевую точку асинхронного программирования в C # 4 :-). Вот почему F # поддерживает асинхронные рабочие процессы (где вы можете писать один и тот же код без обработчиков событий) и почему дизайнеры C # думают о том, чтобы добавить подобное в C # в будущем.