2012-06-25 2 views
3

Вызов метода WriteObject из фонового потока невозможен!Командлет Powershell Custom - вызов WriteObject в фоновом режиме

Есть ли возможность вызвать этот метод в главном потоке powershell (как в WPF)?

Пример кода:

protected override void ProcessRecord() 
{ 
    base.ProcessRecord(); 
    ... 
    Service.StartReading(filter, list => { WriteObject(list, true); }); 
} 

EDIT: The error, which occured after calling the WriteObject method from the thread

Любое решение, обходной путь или быстро исправить?

ТНХ, Mathias

+0

Стандартный метод System.Console.Out.WriteLine() отлично работает, но мне нужно связать те объекты результата! – SpecialHias

ответ

2

Я нашел решение, которое решает мою проблему.

  1. создал ConcurrentQueue

    ConcurrentQueue<LogEntryInfoBase> logEntryQueue = 
         new ConcurrentQueue<LogEntryInfoBase>(); 
    
  2. запустить фоновую нить Епдиеие элементы в ConcurrentQueue

    Task.Factory.StartNew(() => Service.StartReading(
         filter, EnqueueLogEntryInfoBases)); 
    
  3. тем временем, пытаются из очереди из этой очереди в главном потоке

    for (; ;) 
    { 
        LogEntryInfoBase logEntry = null; 
        logEntryQueue.TryDequeue(out logEntry); 
        if (logEntry != null) 
        { 
         WriteObject(logEntry); 
        } 
        Thread.Sleep(100); 
    } 
    

С моей точки зрения, это решение/исправление является уродливым, но оно работает для моей текущей проблемы.

0

Я был застрял на почти той же проблеме. На мой взгляд, мы можем улучшить решение, добавив спать в бесконечный цикл. Конечно, нам нужно будет иметь глобальную ссылку на наш основной поток, и фоновый поток должен будет вызвать прерывание, как только элемент будет добавлен в очередь.

+0

Этот ответ должен быть комментарием ответа SpecialHias, потому что это не ответ на вопрос OP. – honk

+0

SO не позволит мне комментировать, попробовал это первым :) – iamtheone

+0

Thx iamtheone. Я обновлю свое решение. – SpecialHias

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

  • Нет связанных вопросов^_^