2012-12-19 4 views
12

Ho creato un metodo per leggere nuovi messaggi nella posta in arrivo utilizzando il server di scambio come di seguito. Come aggiungere questa raccolta IEnumerable a una coda ed elaborare ogni elenco di elementi all'interno della coda in modo asincrono?Come aggiungere una raccolta IEumerable a una coda ed elaborare ogni elemento in modo asincrono in .NET?

private static IEnumerable<ExchangeEmailInformation> GetInboxItems(ExchangeService service) 
{ 
    var emailInformations = new List<ExchangeEmailInformation>(); 
    try 
    {  
     SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false)); 
     var itemview = new ItemView(int.MaxValue); 
     FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, searchFilter, itemview); 
     Console.WriteLine("\n-------------Result found:-------------"); 
     service.LoadPropertiesForItems(findResults, PropertySet.FirstClassProperties); 

     foreach (var item in findResults) 
     { 
      emailInformations.Add(new ExchangeEmailInformation 
      { 
       Attachment = item.Attachments ?? null, 
       Body = item.Body.BodyType == BodyType.HTML ? ConvertHtml.ToText(item.Body.Text) : item.Body.Text, 
       Subject = item.Subject, 
       RecievedDate = item.DateTimeReceived 
      }); 
     } 
    } 
    catch (Exception ee) 
    { 
     Console.WriteLine("\n-------------Error occured:-------------"); 
     Console.WriteLine(ee.Message.ToString()); 
     Console.WriteLine(ee.InnerException.ToString()); 
     Console.ReadKey(); 
    } 
    return emailInformations; 
} 

Il sotto sono il processo ho bisogno di chiamare in modo asincrono utilizzando ogni articoli in coda

static void AddAttachment(string subject ,string docId, string user, string fileName) 
{ 
    var url = new StringBuilder(); 
    url.Append(string.Format("https://webdemo-t.test.com:8443/Services/Service/MyService.svc/AddAttachment?User={0}&Engagement={1}&FileName={2}&DocumentTrasferID={3}", user, subject, fileName, docId)); 

    Console.WriteLine(url.ToString()); 
    WebRequest request = WebRequest.Create(url.ToString()); 
    var credential = new NetworkCredential("user", "xxxx", "xxxx"); 
    request.Credentials = credential; 
    WebResponse ws = request.GetResponse(); 
    Encoding enc = System.Text.Encoding.GetEncoding(1252); 
    var responseStream = new StreamReader(ws.GetResponseStream()); 
    string response = responseStream.ReadToEnd(); 
    responseStream.Close(); 
    Console.WriteLine(response); 
} 

risposta

1

Si può iniziare nuovo compito per ogni allegato. Non è necessario pensare al numero di attività che si generano. Le attività non sono associate a Thread 1 di 1.

foreach (var item in findResults) 
{ 
    emailInformations.Add(new ExchangeEmailInformation ...); 

    // start new task 
    Task.Factory.Start(() => { 
     AddAttachment(item.Subject, item.docId, item.User ...); 
    }) 
} 

Questo metodo non richiede l'utilizzo di API asincrone.

Un altro modo è utilizzare l'API asincrona delle classi WebRequest/WebResponse.

+0

Desidero elaborare ogni voce in una coda asincronamente – JEMI

+0

Di quanto è necessario migliorare la domanda. Quali passi del tuo algoritmo devono essere eseguiti in modo asincrono? – Lazin

+0

Ho aggiornato la domanda aggiungendo il metodo che ho bisogno di eseguire in modo asincrono – JEMI

2

Se .NET è 4.0 o smth, hai provato il metodo di estensione AsParallel?

+1

+1 PLinq può aiutarti con questo. http://msdn.microsoft.com/en-us/library/dd997425.aspx –

+0

Ho bisogno di elaborare ogni lista di articoli in coda – JEMI

+0

Ancora perché non fai così: foreach (var item in findResults. AsParallel()) {...} – vyakhir

Problemi correlati