Penjujukan Tugasan dan Kemasukan Semula
Isu:
Pertimbangkan senario di mana tugas boleh dilaksanakan sama ada serentak atau tak segerak. Jika tugasan baharu diterima semasa tugasan sebelumnya masih belum selesai, tugasan baharu itu hendaklah dibariskan dan dilaksanakan secara berurutan. Selain itu, setiap keputusan tugasan mungkin bergantung pada hasil tugasan sebelumnya. Cabarannya adalah untuk melaksanakan logik ini sambil turut menyokong kemasukan semula, di mana sesuatu tugas boleh dilaksanakan beberapa kali berturut-turut.
Penyelesaian:
Untuk menguatkuasakan pelaksanaan tugas yang berurutan dan mengelakkan melanggar logik kerana kemasukan semula, adalah perlu untuk membina tugas secara manual menggunakan Tugas
AsyncOp
class AsyncOp<T> { Task<T> _pending = Task.FromResult(default(T)); public Task<T> CurrentTask { get { return _pending; } } public Task<T> RunAsync(Func<Task<T>> handler, bool useSynchronizationContext = false) { var pending = _pending; Func<Task<T>> wrapper = async () => { // await the prev task var prevResult = await pending; Console.WriteLine("\nprev task result: " + prevResult); // start and await the handler return await handler(); }; var task = new Task<Task<T>>(wrapper); var inner = task.Unwrap(); _pending = inner; task.RunSynchronously(useSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current); return inner; } }
Dengan menggunakan kelas AsyncOp yang diubah suai ini, pelaksanaan tugas berurutan dan kemasukan semula dipastikan. Kod yang diubah suai menghasilkan output yang diingini:
Test #1... prev task result: 0 this task arg: 1000 prev task result: 1000 this task arg: 900 prev task result: 900 this task arg: 800 Press any key to continue to test #2... prev task result: 800 this task arg: 100 prev task result: 100 this task arg: 200
Atas ialah kandungan terperinci Bagaimana untuk Memastikan Pelaksanaan Tugasan Berjujukan dan Kemasukan Semula dalam Operasi Asynchronous?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!