2014-10-31 2 views
0

Я немного поработал над написанием асинхронного кода, но у меня все еще есть много вопросов, касающихся моей задачи программирования. В моем приложении веб-форм, нажав кнопку, я хочу запустить метод в другом классе, который выполняет задачу (вставляя данные в db) при обновлении экрана при его прогрессе. Например:C# - асинхронный код, который обновляет ход метода до страницы

btn1_OnClick(object sender, EventArgs e) 
{ 
    //call methodA asynchronously? 
} 

Methoda содержится в другом классе и запросов к базе данных:

public class ClassA 
{ 
    public void methodA(param) 
    { 
     //insert data into database 
     //create string that notifies the progress of the method (should be displayed on page) 

     //insert more data into database 
     //alter string to re-notify of the progress of the method (to be displayed on page) 
    } 
} 

Как вы можете видеть, я хочу, чтобы заполнить строку, которая будет отображаться на странице в виде как метод прогрессирует. Я не знаю, будет ли метод A возвращать тип «void», но я все равно его разместил. Я полагаю, что эта задача должна быть завершена асинхронно или, возможно, с использованием веб-службы. Так как я буду делать это программно?

EDIT

Я прочитал много статей, но никто не похоже, чтобы эффективно описать процесс в моей ситуации. Все они просто описывают либо отображение сообщения в начале или в конце, когда работает работа, работающая в течение длительного времени (в данном случае метод А). Я хочу, чтобы метод выплевывал строку (описывая, где она находится в методе i.e. «вставил первый набор данных» ...) и показывая его на страницу несколько раз по мере ее продвижения. Является ли это слишком амбициозным в моем случае с веб-формами ... Что делать, если я должен был вызвать веб-сервис, который выполняет всю работу и возвращает сообщения?

+0

Существует множество вопросов о том, как «показать прогресс продолжительной работы на веб-странице» ... Рассмотрите поиск самостоятельно, поскольку не похоже, что кто-то знает хороший дубликат. –

+0

@AlexeiLevenkov Пожалуйста, прочтите мое первое редактирование. – frontin

+0

Я не знаю .... Myaby вы должны показать ссылку на лучшее из многих статей ... Лучшие ссылки, которые я получаю для http://www.bing.com/search?q=c%23%20how % 20to% 20show% 20progress% 20of% 20long% 20running% 20operation% 20on% 20web% 20page most say "start operation, каждый шаг должен обновлять прогресс в каком-то постоянном состоянии, а не опрос для этого прогресса через клиентский скрипт по таймеру". Вы можете добавить «длинный опрос», «websocket» или «singnalR» для поиска запросов для решений с более немедленной обратной связью. –

ответ

2

Из вашего описания кажется, что вы хотите использовать шаблон async/await? Это было бы уместно. Не зная больше подробностей о том, что делает ваш methodA, невозможно дать вам точную реализацию. Но вот пример того, что она может выглядеть следующим образом:

async void btn1_OnClick(object sender, EventArgs e) 
{ 
    //call methodA asynchronously 
    await MethodA(2); 
} 

public async Task MethodA(int param) 
{ 
    await Task.Run(() => InsertDataIntoDatabase()); 
    statusTextBox.Text = "first insert done"; 
    await Task.Run(() => InsertMoreDataIntoDatabase()); 
    statusTextBox.Text = "second insert done"; 
} 

выше предполагает, что ваши методы базы данных вставки не уже асинхронные методы. Если они есть, то они не должны быть завернуты в Задачу. Если у вас есть несколько операторов в вашем методе для выполнения этого, то для удобства чтения лучше всего инкапсулировать эти утверждения в отдельный метод. Возможно, вы бы даже повторно использовали код для первой и второй вставки.

Обратите также внимание на то, что вы можете выполнять все обычные вещи, например, цикл. Так что если у вас есть несколько вставок базы данных, но она может быть записана в виде петли, это прекрасно, чтобы сделать это:

public async Task MethodA(int param) 
{ 
    for (int i = 0; i < param; i++) 
    { 
     await Task.Run(() => InsertDataIntoDatabase(i)); 
     statusTextBox.Text = "insert #" + i + " done"; 
    } 
} 

Это должно помочь вам начать работу. В отношении этой общей техники существует множество существующих вопросов относительно SO, и, конечно же, у MSDN есть документация и учебные пособия. Если у вас больше вопросов, вы должны начать там.

+0

Большое спасибо. Это именно то, что я ищу, чтобы заставить меня возглавить в правильном направлении. Еще один вопрос. У меня есть метод А в отдельном классе, поэтому мне нужно каким-то образом передать строку, чтобы страница aspx.cs могла заполнить метку этой строкой? – frontin

+1

+0 Обратите внимание, что при правильном (и непосредственно применимом к * WinForms *) этот ответ действительно не очень помогает в любых веб-случаях (WebForms/Web services/ASP.Net MVC), заданных в вопросе. –

+0

@ RyanGray: Я не знаю, как организованы ваши различные компоненты. Предполагая, что класс, содержащий 'methodA', уже не имеет связанной с представлением логики, я бы не добавил. Но я ожидаю, что было бы целесообразно разоблачить событие для этого класса для таких целей уведомления ... тогда ваш код страницы подписался бы на это событие и таким образом позволит другому классу передать ему строки уведомлений. –

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