2015-08-17 2 views
0

Это только идея о том, что я делаю в службе окна. Я получаю идею от этого video, чтобы сделать это в параллельной обработке.Вызов метода асинхронного ожидания при вызове метода синхронизации

У меня есть два разных метода и класс модели.

Код модели Класс:

public class Email(){ 
    public string Recipient { get; set; } 
    public string Message { get; set; } 
} 

Методы это что-то вроде этого:

public void LoadData(){ 
    while(Main.IsProcessRunning){ 
     // 1. Get All Emails 
     var emails = new dummyRepositories().GetAllEmails(); //This will return List<Emails>. 
     // 2. Send it 
     // After sending assume that the data will move to other table so it will not be query again for the next loop. 
     SendDataParallel(emails);//this will function async? even though the calling method is sync. 

     // This will continue here or wait until it already send? 
     // If it will continue here even though it will not send already 
     // So there's a chance to get the email again for the next loop and send it again? 
    } 
} 

//This will send email at parallel 
public async void SendDataParallel(IList<Email> emails){ 
    var allTasks = emails.Select(SendDataAsync); 
    await TaskEx.WhenAll(allTasks); 
} 

//Assume this code will send email asynchronously. (this will not send email, for sample only) 
public async void SendDataAsync(Email email){ 
    using (var client = new HttpClient()) 
    { 
     client.PostAsync(email); 
    } 
} 

Я только хочу, чтобы получить все очереди сообщений электронной почты затем отправить его параллельно, то подождите, пока он уже не отправить. Я избегаю использования foreach на каждое электронное письмо, которое я получаю.

+7

В чем проблема? –

+0

@SriramSakthivel уже отредактирован.,. – janmvtrinidad

+2

@janmvtrinidad Здесь до сих пор нет вопроса. –

ответ

1

Позволяет начать снизу:

  1. Вы распоряжаетесь своим клиентом до того, как вы действительно получите асинхронное получение HttpResponseMessage. Вы должны сделать свой метод async Task и await внутри:

    public async Task SendDataAsync(Email email) 
    { 
        using (var client = new HttpClient()) 
        { 
         var response = await client.PostAsync(email); 
        } 
    } 
    
  2. В настоящее время ваш SendDataParallel не компилируется.Опять же, он должен вернуть Task:

    public Task SendEmailsAsync(IList<Email> emails) 
    { 
        var emailTasks = emails.Select(SendDataAsync); 
        return Task.WhenAll(allTasks); 
    } 
    
  3. На вершине, вы должны будете await на SendEmailsAsync:

    public async Task LoadDataAsync() 
    { 
        while (Main.IsProcessRunning) 
        { 
         var emails = new dummyRepositories().GetAllEmails(); 
         await SendEmailsAsync(emails); 
        } 
    } 
    

Edit:

Если вы «запустите это в службе windows, вы можете разгрузить его до Task.Run и использовать async ключевое слово:

var controller = new Controller(); 
_processThread = Task.Run(async() => await controller.LoadDataAsync()); 
+0

Нельзя добавить статический тип для LoadDataAsync.,? – janmvtrinidad

+0

Вы хотите, чтобы метод был 'static'? –

+0

Я буду использовать LoadData для вызова в качестве фоновой службы в службе Windows. – janmvtrinidad

1

Разве ваш компилятор не выделяет ваш код с ошибками?

Если вы отмечаете свой метод как асинхронная, пока он не возвращает никакого значения, вы должны установить тип возвращаемого значения, как задача, не пустота:

public async Task SendDataParallel(IList<Email> emails){ 
    var allTasks = emails.Select(SendDataAsync); 
    await Task.WhenAll(allTasks); 
} 

Ваш второй метод также Шоуда вернуть задачу, в противном случае, что вы хотите (a) подождать в первом методе?

public async Task SendDataAsync(Email email){ 
    using (var client = new HttpClient()) 
    { 
     return client.PostAsync(email); 
    } 
} 

Теперь вы можете выбрать все ваши задачи SendDataAsync в SendDataParallel и .Wait() это задача в LoadData в synchronious режима:

public void LoadData(){ 
    while(Main.IsProcessRunning){ 
     var emails = new dummyRepositories().GetAllEmails(); //This will return List<Emails>. 
     SendDataParallel(emails).Wait(); 
    } 
} 

Более подробной информации вы можете найти чтение ответов на других SO вопросов и документы на MSDN:

И как вы использовали LINQ в Select(), который основан на Еогеасп цикла следующей статье также может быть полезно: Nested task inside loop

+0

Я буду использовать wait() на моем LoadData() .., я думаю, что у него будет ошибка в SendDataAsync, при возврате нет ожидающего ключевого слова., В любом случае спасибо за ваше решение. – janmvtrinidad

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