Bence cevabınız bir geri çağırmadır.
Uzun süren iplerinizi hazırlarken, bir yönteme başvuruda bulunun. Geri arama yöntemini görev yöntemine iletebilir veya Delegelerin BeginInvoke() özelliğine yerleşik bir AsyncCallback delege örneği oluşturabilirsiniz. Geri arama yöntemi IAsyncResult kabul belirli bir temsilci tanımına uyması zorunludur,
public void StartMyTwoTasks()
{
//I'm passing the callback to the task method directly; you may prefer to pass it to BeginInvoke()
var task1Lambda =()=>Task1(TaskCompleted);
var task2Lambda =()=>Task2(TaskCompleted);
task1Lambda.BeginInvoke(null,null);
task2Lambda.BeginInvoke(null,null);
}
public void Task1(Action<int> task1Complete)
{
//perform your long-running calculation or data retrieval/transformation here
Thread.Sleep(10000);
//when finished, call the callback method.
//You may need to use Control.Invoke() to make sure the callback is executed on the UI thread
//If you use the AsyncCallback feature of BeginInvoke/EndInvoke, you don't have to make the call here.
taskComplete(1);
}
public void Task2(Action<int> taskComplete)
{
//Ditto
Thread.Sleep(8000);
taskComplete(2);
}
public void Task1Complete(int taskNumber)
{
TasksComplete[taskNumber-1] = true;
If(TasksComplete.All(x=>x==true))
DoSomethingOnceAllTasksAreComplete();
}
AsyncCallback özelliğini kullanarak, ancak içinde düzgün çağırma hakkında endişelenmenize gerek yok: İşte
temel örnek senin yöntemin; çerçeve sizin için geri bildirimi işler:
Her iki model de sizin için iyi çalışmalıdır. Diğer seçenekler, tamamlandığında her yöntem tarafından yükseltilen bir olayın ayarlanmasını içerir. Olaylar hemen hemen aynı şekilde çalışacaktır, çünkü olaylar sadece bazı sözdizimi şekilli "çok döküm" delegelerdir.
Bu tam olarak aradığım şey. Çerçevede böyle bir şey olduğundan şüphe ettim, bunu bulamadım. – Mas