2011-03-20 9 views
5

मेरे पास एक कंसोल प्रोग्राम है, मैं लगातार कंसोल के परिणाम को दर्पण करना चाहता हूं। संग्रह में लिखो, जिसे मैं वास्तविक समय की पूंछ देख सकता हूं। संग्रह एक सरणी, एक सूची, आदि हो सकता हैक्या कंसोल के परिणाम को निरंतर दर्पण करने का कोई तरीका है। संग्रह (सरणी, सूची, आदि) को लिखें?

मुझे लगता है कि मुझे कुछ प्रकार के ईवेंट हैंडलर का उपयोग करना होगा?

मुझे किसी तृतीय पक्ष लाइब्रेरी की दिशा में इंगित करने की कोई बात नहीं है, उदा। NLog।

अद्यतन

मैं स्मृति में एक संग्रह है, जो वर्तमान सांत्वना राज्य दर्पण बनाए रखने की जरूरत (मैं तो सॉकेट का उपयोग कर एक दूरस्थ WinForms अनुप्रयोग के लिए भेज सकते हैं)। विवरण एक तरफ, मुझे लगता है कि मैं इसे सी # की कुछ पंक्तियों के साथ कर सकता हूं - मैं इसके लिए एक अच्छी आवश्यकता के बिना एक विशाल लॉगिंग लाइब्रेरी नहीं जोड़ना चाहता हूं।

उत्तर

5

कंसोल क्लास आपको आउटपुट और त्रुटि स्ट्रीम को प्रतिस्थापित करने की अनुमति देता है। बस आपको यहां क्या चाहिए, आप उन्हें टेक्स्टवाइटर के साथ प्रतिस्थापित कर सकते हैं जो लिखा गया है कि लॉग भी करता है। एक नमूना कार्यान्वयन:

class ConsoleLogger : System.IO.TextWriter { 
     private System.IO.TextWriter oldOut; 
     private Queue<string> log = new Queue<string>(); 
     private StringBuilder line = new StringBuilder(); 
     private object locker = new object(); 
     private int newline; 
     private int logmax; 

     public ConsoleLogger(int history) { 
      logmax = history; 
      oldOut = Console.Out; 
      Console.SetOut(this); 
     } 
     public override Encoding Encoding { 
      get { return oldOut.Encoding; } 
     } 
     public override void Write(char value) { 
      oldOut.Write(value); 
      lock (locker) { 
       if (value == '\r') newline++; 
       else if (value == '\n') { 
        log.Enqueue(line.ToString()); 
        if (log.Count > logmax) log.Dequeue(); 
        line.Length = newline = 0; 
       } 
       else { 
        for (; newline > 0; newline--) line.Append('\r'); 
        line.Append(value); 
       } 
      } 
     } 
    } 

उपयोग:

static void Main(string[] args) { 
     var outLogger = new ConsoleLogger(100); 
     // etc... 
    } 
0

उपयोग log4net continuosly फाइल में डंप, और फिर पूंछ के लिए इसका उपयोग के लिए: http://tailf.codeplex.com/

1

आप एक सरल सहायक विधि बना सकते हैं और फोन Console.Write के बजाय कि कर सकते हैं।

private void WriteToConsole(string message) 
{ 
    myList.Add(message); 

    Console.Write(message); 
} 
+0

ठीक है, यह काम करने योग्य है। हालांकि, मैं मौजूदा कंसोल ऐप को नहीं बदलेगा, और कंसोल। राइट() के लिए कई पैरामीटर होने पर इससे समस्याएं पैदा होंगी। – Contango

2

आप शायद लिख सकता है एक नया TextWriter जो Write कॉल है बजाय एक धारा के लिए लिख की एक सूची को पॉप्युलेट। इसके बाद आपको इसे Console.SetOut(...)

2

Console.SetOut का उपयोग करके सेट करना होगा, आप अपना कस्टम कार्यान्वित टेक्स्टवाइटर सेट कर सकते हैं।

1

आप कोड लिखने की तरह चाहते हैं:

WriteToConsole("{0} tel is: {1:+### ### ### ###}", "Name", 242352356578); 

तो फिर तुम कोड हो सकता है:

private static Queue<String> q = new Queue<String>(1000); 
    private static void WriteToConsole(String message) 
    { 
     q.Enqueue(message); 
     Console.Write(message); 
    } 
    private static void WriteToConsole(String message, params Object[] r) 
    { 
     String s = String.Format(message, r); 
     q.Enqueue(s); 
     Console.Write(s); 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे