2013-03-12 14 views
7

Sto cercando di ottenere comprensione di .NET 4.0 + Task Parallel Library concetti ...Perché la proprietà Risultato dell'attività non è disponibile per Attività non generica (C# 4.0+)?

Nel seguente frammento di codice C# 4.0:

Task t = Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("I am the task"); 
    return "res1"; 
}); 

perché il compilatore non lo fa (e run-time sia) produce alcun errore se il ritorno non può essere usato se Task generico usato al posto:

Task<string> t = Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("I am the task"); 
    return "res1"; 
}); 

O (oggetto restituito) può essere utilizzato?

Ho capito correttamente che <string> in Task<string> è necessario solo per rilevare o assicurare il tipo di ritorno (oggetto ed) o di t.Result?
O ci sono altre cose nascoste da me, eccetto questo?

Perché questo tipo non può essere determinato dal tipo di oggetto restituito?
I.e. perché la proprietà Result di un'attività non è disponibile per attività non generiche?

risposta

16

Il non generico Task non ha una proprietà Result perché rappresenta un processo che non produrre un risultato.

Il codice crea un Task<string> in entrambi i casi, ma nel primo caso si gettò in un Task (Task<string> deriva da Task, così che è legale) e così si perde la capacità di fare riferimento al risultato.

si può vedere questo direttamente con:

Task t = Task.Factory.StartNew(() => 
{ 
    Console.WriteLine("I am the task"); 
    return "res1"; 
}); 

var genericTask = t as Task<string>; // genericTask will be non-null 
var result = genericTask.Result;  // and you can access the result 
+0

Sì, l'ho visto ma non riuscivo a capire perché l'attività non generica non può avere la proprietà 'Result' – Fulproof

+1

@Fulproof È una cosa concettuale. 'Task' è più o meno concettualmente equivalente al tipo di ritorno' void' in async/Task world, mentre 'Task ' è equivalente al tipo di ritorno 'T'. Ora, dato un metodo 'void Foo()' non proverei a fare 'var result = Foo();', vuoi? :) –

+0

Perché, quindi, il ritorno dall'attività non generica "attività" non viene compromesso dal compilatore come un errore o addirittura un avviso? – Fulproof

-1

Task<T> eredita da Task. In entrambi i casi in realtà stai creando un Task<T>, ma nel primo caso lo stai implicitamente trasmettendo a Task, che non ha la proprietà Result.

Problemi correlati