3

无法从后台线程调用 WriteObject 方法!

是否有可能在 powershell 的主线程中调用/调度此方法(如在 WPF 中)?

代码示例:

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

编辑: 从线程调用 WriteObject 方法后发生的错误

任何解决方案、解决方法或快速修复?

谢谢,马蒂亚斯

4

2 回答 2

2

我找到了一个解决方案,它解决了我的问题。

  1. 创建了一个并发队列

    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);
    }
    

从我的角度来看,这个解决方案/修复很丑陋,但它适用于我当前的问题。

于 2012-06-29T08:09:12.200 回答
0

我被困在几乎相同的问题上。在我看来,我们可以通过在无限循环中添加睡眠来改进解决方案。当然,我们需要对主线程有一个全局引用,而后台线程需要在队列中添加项目后立即调用中断。

于 2014-04-29T17:54:24.640 回答