Už jsem napsal jednoduchou třídu nápovědy pro logování, zkopírovanou z jiného frameworku, a test není snadno použitelný, a to následovně:
Tento článek znovu implementuje jednoduchou třídu logování založenou na BlockingCollection.
BlockingCollection<T> je třída kolekcí bezpečná pro vlákna, která poskytuje následující funkce:
Zaveďte model maker-uživatel. Přidávejte a načítajte položky současně pomocí vícevláknového zpracování. Volitelná maximální kapacita. Když je kolekce prázdná nebo plná, je blokována operacemi vložení a odstranění. Pokusy o vložení a odstranění neblokují ani neprobíhají po stanovenou dobu. Encapsulation implementuje jakýkoli typ kolekce IProducerConsumerCollection<T> Použijte značku cancel k provedení akce cancel. Podporovány jsou dva typy enumů, které používají foreach (ve Visual Basicu For Each): enumy pouze pro čtení. Enumerace, která odstraní položku při jejím vyjmenování.
Microsoft představuje:Přihlášení k hypertextovému odkazu je viditelné.
BlockingCollection je fronta blokování bezpečná pro vlákna, která využívá tuto funkci k implementaci režimu producent-spotřebitel v rámci procesu, jako je přeposílání zpráv, logování apod.
Použij metodu Add pro přidání informací do fronty a když fronta nemá žádné zprávy, IsCompleted vždy zablokuje while smyčku, takže nezpůsobí mrtvou smyčku. Když přijde nová zpráva, spustí se IsCompleted in while a vrátí typ bool, což způsobí pokračování vykonání, tedy načtení dat z vlákna.
Dříve jsme vlákno blokovali voláním metody WaitOne ManualResetEvent, voláním metod Reset a Set pro předání signálu, a to následovně:
Test zapíše 10 000 logů, což trvá méně než 10 milisekund, jak je znázorněno na obrázku níže:
Kód je následující:
Stažení zdrojového kódu:
Turisté, pokud chcete vidět skrytý obsah tohoto příspěvku, prosím Odpověď
|