![](/img/trans.png)
[英]Best way to store values in .Net Compact Framework using C#?
[英]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.