Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memastikan Pelaksanaan Tugasan Berjujukan dan Kemasukan Semula dalam Operasi Asynchronous?

Bagaimana untuk Memastikan Pelaksanaan Tugasan Berjujukan dan Kemasukan Semula dalam Operasi Asynchronous?

Mary-Kate Olsen
Lepaskan: 2024-12-30 12:17:10
asal
891 orang telah melayarinya

How to Ensure Sequential Task Execution and Re-entrancy in Asynchronous Operations?

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 pembina dan mulakannya kemudian. Kaedah Task.Unwrap() boleh digunakan untuk mendapatkan tugasan sebenar yang akan dilaksanakan.

AsyncOp yang diubah suai kelas di bawah melaksanakan pendekatan ini:

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;
    }
}
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan