【发布时间】:2016-05-12 08:05:41
【问题描述】:
我正在编写一个涉及 IronRuby 的应用程序。当我收到来自 ruby 脚本的输出时,我想更新 UI 元素,因此我设置了以下内容:
var ScriptEngine engine = IronRuby.Ruby.CreateEngine();
MemoryStream outputStream = new MemoryStream();
engine.Runtime.IO.SetOutput(outputStream, Encoding.Default);
这会将 IronRuby 的输出重定向到名为 outputStream 的自定义流。但是,一旦流接收到新信息,我似乎无法弄清楚如何调用代码块。我怎么能做以下等效的事情?
outputStream.DataReceived += (sender, e) =>
{
// assumes I passed in the Func `processing` to my method
processing(e.Value);
};
谢谢!
【问题讨论】:
-
您通常设置一个缓冲区
byte[2048] buffer并执行while(outputStream.Read()),这将连续循环读取2048字节,并在流打开时继续这样做。看到这个answer -
@CallumLinington 这不是异步的。
-
也许如果我使用
BackgroundWorker我可以在新线程中运行它? -
你是什么意思异步,在另一个线程中运行或使用
async/await,因为它们都可以通过流看到ReadAsync()来完成 -
为什么要异步 MemoryStream 操作?您只是将字节从一个位置复制到另一个位置