2015-02-18 2 views
1

Итак, я играю с Multi Threading. У меня есть определенная форма, которая заставляет тихо всплывать, поскольку она загружает данные из файла. Моя идея состояла в том, чтобы загрузить данные в фоновом режиме, но все равно отображать форму и иметь сообщение в форме, показывающей, что загружаются дополнительные данные.Используйте Задачи/Многопоточность для загрузки данных и отображения UI

У меня все сделано, за исключением того, что я не уверен, как получить уведомление, что поток сделан и готов передать мне данные в виде словаря.

Это, насколько я получил: P

Dim t1 As Task(Of Dictionary(Of String, Double())) 

Private Sub cbchannels_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbchannels.SelectedIndexChanged 
    t1 = Task(Of Dictionary(Of String, Double())).Factory.StartNew(Function() Load_Data()) 
End Sub 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    If t1.IsCompleted Then 
     data = t1.Result 
    End If 
End Sub 

Я знаю, что задача имеет возможность проверить, если его завершения и получить результаты

t1.IsCompleted 
t1.Result 

использует таймер постоянно проверять, завершена ли задача? И что я делаю, имеет смысл? Я не хочу использовать BackgroundWorker.

ответ

1

Этот таймер очень умный. К счастью, есть прямое уведомление. Вы можете позвонить ContinueWith на любом Task, чтобы зарегистрировать обратный вызов, который вызывается, когда эта задача завершается. Это отвечает на ваш вопрос, как было задано.

Вместо этого вы должны смотреть в асинхронный режим и ждать. Запуск фоновой работы в приложениях пользовательского интерфейса стал намного проще с C# 5.

+0

Но как зарегистрировать обратный звонок? Я не смог заставить его работать. Любая попытка использовать ожидание заставит программу ждать в этой точке –

+0

.ConfigureAwait (false); Кроме того, вы можете столкнуться с тупиками ... Возможно, вам захочется немного поразмыслить по шаблонам асинхронного ожидания для UI. – Vivek

+0

Опубликовать текущий код, который у вас есть. Невозможно диагностировать без него. – usr

1

Хотя это не единственный способ, самым простым вариантом может быть использование BackgroundWorker. Вы вызываете RunWorkerAsync, чтобы установить его и выполнить работу в обработчике событий DoWork. По завершении присвойте данные объекту e.Result. Затем вы можете вернуть это обратно в поток пользовательского интерфейса в обработчике событий RunWorkerCompleted. Например.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    Dim table As DataTable = GetData() 

    e.Result = table 
End Sub 

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 
    Dim table = DirectCast(e.Result, DataTable) 

    'Use table here. 
End Sub 
Смежные вопросы