Я добавляю некоторые данные в список, и это может занять некоторое время.Поэтому я выполняю это действие асинхронно.Я делаю это так:
ScanDelegate worker = StartScan;
AsyncCallback completedCallback = ScanCompletedCallback;
lock (_sync)
{
var async = AsyncOperationManager.CreateOperation(null);
worker.BeginInvoke(completedCallback, async);
}
Информация, добавленная в StartScan (), правильно добавлена в список.Когда сканирование завершено, я хочу выполнить другое сканирование, в зависимости от данных в списке.Поэтому я запускаю другое сканирование в методе ScanCompletedCallback ().Но на данный момент мой список пуст.Я предполагаю, что это потому, что метод обратного вызова вызывается, когда рабочий запущен, а не когда он возвращается.
Это правда?
И если это так, как я могу знать, когдамой работник выполнил свои задачи?
Редактировать: Я не могу разобраться с этим.Это не имеет смысла.Я подумал о списке, к которому добавляю.Я не мог просто добавить к этому, мне пришлось обернуть его в ветке Dispatcher.Это должно быть проблемой, верно?Есть ли способ заставить мой метод Async StartScan () ждать этого диспетчера?
Заранее спасибо!
StartScan ()
private void StartScan()
{
//For testing
for (int t = 0; t < 1; t++)
{
var app2 = Application.Current;
if (app2 != null)
{
app2.Dispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(AddComputerToList),
new ComputerModel()
{
HostName = "Andreas-PC",
IpAddress = "192.168.1.99",
ActiveDirectoryPath = "ikke i AD",
Name = "Andreas-PC",
OperatingSystem = "Microsoft Windows 7 Enterprise"
});
}
}
}
ScanCompletedCallback ()
private void ScanCompletedCallback(IAsyncResult ar)
{
var worker = (ScanDelegate)((AsyncResult)ar).AsyncDelegate;
var async = (AsyncOperation)ar.AsyncState;
worker.EndInvoke(ar);
lock (_sync)
{
IsScanning = false;
}
var completedArgs = new AsyncCompletedEventArgs(null, false, null);
async.PostOperationCompleted(e => OnScanCompleted((AsyncCompletedEventArgs)e), completedArgs);
}
AddComputerToList ()
private object AddComputerToList(Object objComputer)
{
var computer = objComputer as ComputerModel;
if (computer != null)
{
ComputersList.Add(computer);
OnPropertyChanged("ComputersList");
}
return null;
}