2012-05-14 5 views
1

Я хочу выйти из программы, если вижу некоторые ключевые слова, которые появляются в Console.Out. Это связано с тем, что мы используем стороннюю DLL, у которой есть проблема, когда он сталкивается с каким-то конкретным исключением, он никогда не выходит.Как я могу контролировать console.out?

Единственный сулион для нас, похоже, отслеживает журнал, который заполнен до console.Out. И основываясь на журнале на console.out, приложение-хозяин может решить, что делать, когда такое исключение встречается.

Кто-то сказал мне, что я могу использовать прослушиватель трасс ... но я не уверен в этом. Что вы, ребята, думаете?

ответ

3

Класс Console предоставляет метод SetOut, который может использоваться для записи вывода в пользовательский поток. Например, вы можете передавать StringBuilder и отслеживать изменения или писать пользовательскую реализацию потока, которая следит за ключевыми словами.

Например, вот KeywordWatcherStreamWrapper класса, который следит за указанные ключевые слова, и вызывает событие для всех слушателей всякого раза, когда ключевое слово видно: Использование

public class KeywordWatcherStreamWrapper : TextWriter 
{ 
    private TextWriter underlyingStream; 
    private string keyword; 
    public event EventHandler KeywordFound; 
    public KeywordWatcherStreamWrapper(TextWriter underlyingStream, string keyword) 
    { 
     this.underlyingStream = underlyingStream; 
     this.keyword = keyword; 
    } 

    public override Encoding Encoding 
    { 
     get { return this.underlyingStream.Encoding; } 
    } 

    public override void Write(string s) 
    { 
     this.underlyingStream.Write(s); 
     if (s.Contains(keyword)) 
      if (KeywordFound != null) 
       KeywordFound(this, EventArgs.Empty); 
    } 

    public override void WriteLine(string s) 
    { 
     this.underlyingStream.WriteLine(s); 
     if (s.Contains(keyword)) 
      if (KeywordFound != null) 
       KeywordFound(this, EventArgs.Empty); 
    } 
} 

Примера:

var kw = new KeywordWatcherStreamWrapper(Console.Out, "Hello"); 
kw.KeywordFound += (s, e) => { throw new Exception("Keyword found!"); }; 

try { 
    Console.SetOut(kw); 
    Console.WriteLine("Testing"); 
    Console.WriteLine("Hel"); 
    Console.WriteLine("lo"); 
    Console.WriteLine("Hello"); 
    Console.WriteLine("Final"); 
} catch (Exception ex) { Console.Write(ex.Message); } 

На второй оператор Write, который содержит ключевое слово целиком, событие будет поднято и, таким образом, будет выбрано исключение. Обратите также внимание на то, что это тихо обертывает базовый поток и все еще записывает на него, поэтому вывод консоли все равно генерируется как обычно.

Пример вывод:

Testing 
Hel 
lo 
Hello 
Keyword found! 
+0

большое спасибо. Это лишь частично работает для меня. Некоторые из журналов, доступных в консоли, не отфильтровываются KeywordWatcherStreamWrapper. не знаю, в чем причина – KKKoo0

+0

Я только переопределил два метода в классе 'TextWriter':' Write (string) 'и' WriteLine (string) '. Есть что-то вроде 30-40 возможных методов для переопределения, поэтому вам может потребоваться проверить, используются ли другие из них, например, «WriteLine (object)» или «WriteLine (bool)» и т. Д. – mellamokb

+0

yes, true , это должна быть проблема. Я использовал другой способ решить эту проблему, используя прослушиватель трассировки – KKKoo0

0

, если вы можете обернуть это в ех, может быть, вы можете использовать Process.StandardOutput.

+0

Я хочу сделать это в процессе – KKKoo0

Смежные вопросы