簡體   English   中英

使用C#.Net Compact Framework中的線程序列化任務的最佳方法是什么?

[英]What is the best way of serializing the tasks using threads in C# .Net Compact Framework?

在我的程序中,我接收到一些數據,因此必須將其保存到一個文件(一個或多個)中,這一點非常重要,因此應該就像先保存一樣。

最后,我得到一個信號,此時不再有數據可用,我必須關閉所有打開的文件,我該如何處理它,我的意思是如何確保所有線程都完成了工作,所以,我可以關閉文件。

我正在使用ManualResetEvent來控制數據的順序,因此下一個線程正在等待上一個線程完成工作。

以下是我的代碼示例,我需要一些准則來以非常有效的方式完成相同的工作,並且我如何知道所有線程都完成了工作。

class Program
    {
        static StreamWriter _fileStream;
        static void Main(string[] args)
        {
            _fileStream = File.CreateText(@"D:\HelloThread.txt");               
            ManualResetEvent currentEvent = new ManualResetEvent(true);
            ManualResetEvent nextEvent = new ManualResetEvent(false);              
            int length = 60;
            Data data = null;
            Console.WriteLine("Writing started...");
            for (int i = 0; i < length; i++)
            {
                data = new Data { CurrentEvent = currentEvent, Number = i, NextEvent = nextEvent };
                ThreadPool.QueueUserWorkItem(PrintMsg, data);                   
                currentEvent = nextEvent;
                nextEvent = new ManualResetEvent(false);
            }


            Console.ReadLine();
        }

        private static void CloseAll()
        {
            Console.WriteLine("Requested to close all...");


            Console.WriteLine("Done with the writing...");
        }

        private static object _lockObj = new object();

        private static void PrintMsg(object state)
        {
            Data data = state as Data;

            data.CurrentEvent.WaitOne();

            string msg = "Hello times...";
            for (int j = 0; j < 5; j++)
            {
                _fileStream.WriteLine(msg + data.Number);
               // Console.WriteLine(msg + data.Number);
            }

            data.NextEvent.Set();
        }
    }

    public class Data
    {
        public ManualResetEvent CurrentEvent { get; set; }
        public ManualResetEvent NextEvent { get; set; }
        public int Number { get; set; }
    } 

聽起來您正在描述一個應用程序管道,其中有多個線程,每個線程都在一個工作項的單獨部分上工作。 例如,一個線程可能正在執行輸入,一個線程正在執行進程,而一個線程正在執行輸出。

通常,您可以通過創建多個隊列來處理此問題。 假設您有這三個線程。 輸入線程讀取一條記錄並將其放入輸入隊列。 處理線程讀取輸入隊列,處理項目,然后將結果放入輸出隊列。 然后,輸出線程讀取輸出隊列,並將數據寫入需要到達的位置。

這樣可以確保以正確的順序處理和寫入工作項,但允許所有線程同時工作。

使用BlockingCollection ,您可以讓您的線程在隊列上進行非繁忙的等待。 同樣,當輸入線程完成讀取時,它可以在隊列上調用CompleteAdding以發出信號,表明沒有更多的工作項。 當處理線程讀取隊列時,它可以檢查IsCompleted屬性以確定是否所有項目都已完成,然后退出。 讀取輸出隊列時,輸出線程也是如此。

有關使用BlockingCollection一些簡單示例,請參見http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=821

如果您不能使用BlockingCollection ,則必須在Queue<T>周圍包裝一個並發層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM