Non sono sicuro se questo è possibile, ecco me out:passando un compito come parametro di
ho una sequenza di azioni da eseguire molteplici
async Task MethodA(...)
{
// some code
// a call to specific Async IO bound method
// some code
}
ci sono anche MethodB()
, MethodC()
, ecc e tutti hanno esattamente lo stesso codice, eccetto per la chiamata a un metodo associato ad Async I/O. Sto cercando di trovare un modo per passare un puntatore a un metodo, in modo che possiamo eseguirlo successivamente in un metodo().
Quello che sto facendo attualmente è questa:
private async Task Method(Func<Task<Entity>> func)
{
// some code
var a = await task.Run(func);
// some code
}
var task = async() => await CallToIOBoundTask(params);
Method(task);
Questo codice, però, tira un nuovo thread ogni volta, che non è richiesto per IO compito legato, e dovrebbero essere evitati.
Quindi, esiste un metodo per il refactoring del codice in modo che non venga utilizzato thread ThreadPool? Un obiettivo è avere un codice come questo:
private async Task Method(Task<Entity> task)
{
// some code
var a = await task;
// some code
}
È anche importante ricordare che diverse chiamate di I/O hanno differenti firme di metodo. Inoltre, un'attività può iniziare a essere eseguita solo nel corpo Method()
e non prima.
Si desidera attendere fino all'istruzione nel metodo 'Method()' per l'avvio dell'attività asincrona? In tal caso, l'esempio di codice nella domanda non è corretto (in attesa di un'attività _existing_ invece di crearne uno) e la risposta già fornita è ciò che desideri. Ma se vuoi solo essere in grado di attendere un'attività che hai iniziato prima che venga chiamato il metodo 'Method()', nota che puoi farlo facilmente: basta chiamare ad es. passare il valore di ritorno di una chiamata a 'CallToIOBoundTask()' come argomento per la chiamata al metodo 'Method()'. –
@PeterDuniho Una risposta alla tua domanda è nell'ultima frase della domanda - L'attività deve iniziare la sua esecuzione in method(). – Goran