Пользовательский командлет Powershell — вызов WriteObject в фоновом потоке

Вызов метода WriteObject из фонового потока невозможен!

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

Пример кода:

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

EDIT: Ошибка, возникшая после вызова метода WriteObject из потока

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

спасибо, Матиас


person SpecialHias    schedule 25.06.2012    source источник
comment
Стандартный метод System.Console.Out.WriteLine() отлично работает, но мне нужно передать эти объекты результатов!   -  person SpecialHias    schedule 25.06.2012


Ответы (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);
    }
    

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

person SpecialHias    schedule 29.06.2012

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

person iamtheone    schedule 29.04.2014
comment
Этот ответ должен быть комментарием к ответу SpecialHias, потому что это не ответ на вопрос ОП. - person honk; 29.04.2014