У меня есть таймер и фоновый рабочий, который запускается при каждом тике таймера. Иногда мне нужно, чтобы пользователь остановил этот рабочий процесс и вызвал того же самого bg работника одним нажатием кнопки.
Так как это в Silverlight, это все асинхронно. BG работник выполняет асинхронный вызов Webservice, который асинхронно возвращает данные.
Я сделал это, но это просто неправильно. Как лучше всего справиться с такой ситуацией?
button_click_event(..)
{
_loadTimer.Stop();
_worker.CancelAsync();
_worker.RunWorkerAsync();
}
WebService call
public void GetUserStats(DateTime start, DateTime end, Action<IEnumerable<IUserStats>, Exception> callback)
{
_context.GetUserStatsCompleted += ContextGetUserStatsCompleted;
_context.GetUserStatsAsync(start,end,callback);
}
void ContextGetUserStatsCompleted(object sender, GetUserStatsCompletedEventArgs e)
{
var callback = e.UserState as Action<IEnumerable<IUserStats>, Exception>;
Exception error = null;
var result = new ObservableCollection<IUserStats>();
if (e.Error == null)
{
result = e.Result;
}
else
{
error = e.Error;
}
_context.GetUserStatsCompleted -= ContextGetUserStatsCompleted;
callback(result, error);
}
и мой рабочий
void WorkerDoWork(object sender, DoWorkEventArgs e)
{
TicketService.GetUserStats(StartDate, EndDate, (result, error) =>
{
StreamHolder = result;
});
}