2013-03-12 5 views
1

У меня только что было интервью 5 минут назад. Мне дали этот сценарий, и он задал мне вопрос о том, как справиться с этим в C# 1.0 или 2.0. Он сказал, что есть базовая функция, чтобы справиться с этим, я не был уверен. Может кто-то пожалуйста, помогите :(Как справиться с этим сценарием асинхронного программирования в C#

. Вопрос:

Есть 2 текстовых полей в приложении Winform и кнопка Один текстовое поле принимает значение входного сигнала и при нажатии на кнопку, он обрабатывает вход в сервер, который принимает ад много время и, наконец, результат отображается в другом текстовом поле как это занимает очень много времени на сервере, интерфейс не должен быть interupted, как вы справляетесь с таким сценарием, он спросил меня :(

ответа Я дал:.

Я сказал многопоточность и сказал об асинхронном ожидании. Он ожидал простой способ справиться с этим в C# 2.0 г. Я догадывался о асинхронных делегатах. Он не был убежден. Пожалуйста, объясните мне, пожалуйста, с небольшим понятным кодом :)

ответ

2

Вы бы запустить длинный запущенный процесс в отдельном потоке к пользовательскому интерфейсу, чтобы предотвратить его висит, возможно, BackgroundWorker будет использоваться, например: -

bgWorker.RunWorkerAsync([DATA TO PROCESS])//Passing in data to operate on 

private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
     MyObject obj = (MyObject)sender; 

     // 
     // Do some work with the data on the server 
     // 

     // Report on progess, is it done? 
     bgWorker.ReportProgress(); 
} 

Вы также можете иметь рабочий полный метод

private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
     //Work is complete, notify user 
} 

Вы также может использовать ThreadPool, который требует немного больше настроек, но я нахожу более гибким. Например: -

ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), [DATA TO PROCESS]); 
Interlocked.Increment(ref workItems); 

WorkItems бы подсчет количества элементов осталось обработать, это может быть использовано для отслеживания того, является ли или нет завершена задача. Затем мы определяем метод DoWork, где обрабатываем данные и уменьшаем наш счетчик workItems. После того, как элемент был обработан, доклад о ходе работы через делегат, такие как: -

private delegate void ThreadDone(MyObject obj); 
    private delegate void TaskDone(); 

    public void DoWork(object sender) 
    { 
     MyObject obj = (MyObject)sender; 

     this.Invoke(new ThreadDone(ReportProgress), result); 
     Interlocked.Decrement(ref workItems); 

     if (workItems == 0) 
     { 
      this.Invoke(new TaskDone(WorkComplete)); 
     } 
    } 

Отчет о ходе может выглядеть следующим образом: -

private void ReportProgress(MyObject obj) 
{ 
    if (workItems >= 0) 
    { 
     //Job isn't complete, report progress    
    } 
} 

private void WorkComplete() 
{ 

} 
+0

Привет, DGibbs, большое спасибо за то, что помогли мне, это очень помогает мне , Я расскажу об этом подробнее. Cheers :) – Learner

+2

Downvoter хочет прокомментировать? – DGibbs

0

В приложениях winform .Net 2 простейшим решением является использование BackgroundWorker. Его события поднимаются в потоке пользовательского интерфейса, поэтому вам не нужно выполнять какие-либо манипуляции.

Обычная картина выглядит следующим образом:

BackgroundWorker bg = new BackgroundWorker(); 
bg.DoWork += delegate(object sender, DoWorkEventArgs e) { 
    try { 
     e.Result = server.LongRunningOperation(); 
    } 
    catch(Exception ex) { 
     e.Error = ex; 
    } 
}; 

bg.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) { 
    //update UI 
}; 

bg.RunWorkerAsync(); 
+0

Спасибо так много Ли, это помогает мне, я думаю, что это это то, чего он ожидал, черт возьми, я не сказал этого :(Я сейчас изучу эту концепцию :) Еще раз спасибо :) Приветствия – Learner

Смежные вопросы