gpt4 book ai didi

multithreading - 从控制台应用程序读取输出和WPF绘图异步

转载 作者:行者123 更新时间:2023-12-03 13:13:42 25 4
gpt4 key购买 nike

我有一个控制台应用程序,每1秒输出大约160行信息。

数据输出是可用于在图形上绘制的点。

在我的WPF应用程序中,我已经成功地将其连接起来,并且正在绘制控制台应用程序输出的数据,但是,在大约500个数据点之后,我发现应用程序和UI线程锁定的速度明显下降。

我认为这是由于我使用的异步操作引起的:

BackgroundWorker worker = new BackgroundWorker();

worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
_process = new Process();
_process.StartInfo.FileName = "consoleApp.exe";
_process.StartInfo.UseShellExecute = false;
_process.StartInfo.RedirectStandardOutput = true;
_process.StartInfo.CreateNoWindow = true;
_process.EnableRaisingEvents = true;
_process.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
_process.Start();
_process.BeginOutputReadLine();
_watch.Start();
};
worker.RunWorkerAsync();

而负责解析和绘制数据的处理程序:
private void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!String.IsNullOrEmpty(outLine.Data))
{
var xGroup = Regex.Match(outLine.Data, "x: ?([-0-9]*)").Groups[1];
int x = int.Parse(xGroup.Value);

var yGroup = Regex.Match(outLine.Data, "y: ?([-0-9]*)").Groups[1];
int y = int.Parse(yGroup.Value);

var zGroup = Regex.Match(outLine.Data, "z: ?([-0-9]*)").Groups[1];
int z = int.Parse(zGroup.Value);


Reading reading = new Reading()
{
Time = _watch.Elapsed.TotalMilliseconds,
X = x,
Y = y,
Z = z
};


Dispatcher.Invoke(new Action(() =>
{
_readings.Enqueue(reading);
_dataPointsCount++;

}), System.Windows.Threading.DispatcherPriority.Normal);
}
}
_readingsthis answer中定义的自定义 ObservableQueue<Queue>。我已经对其进行了修改,以便一次只能将50个项目放入队列中。因此,如果要添加新项并且队列计数> = 50,则会在 Dequeue()之前调用 Enqueue()

有什么方法可以提高性能,还是因为控制台应用程序输出了多少而注定了?

最佳答案

从这里我可以看出正在发生的情况:

  • IU线程启动后台工作程序以启动控制台应用程序。
  • 它将控制台的输出重定向,并使用UI线程
  • 上的处理程序进行处理
  • 然后,UI线程上的处理程序每​​秒调用Dispatcher.Invoke 160次以更新同一线程上的队列对象。
  • 在调用50次之后,队列开始阻塞,而UI取消了对项目的排队

  • 问题似乎是:

    让UI线程处理来自控制台和队列的原始输出以及对Graph的更新。

    一旦UI落后50个以上的数据项,入队和出队之间的阻塞也会存在潜在的问题,这可能会导致级联失败。 (我看不到足够的代码来确保这一点)

    解析度:
  • 启动另一个后台线程来管理控制台应用程序
  • 中的数据
  • 新线程应该:创建队列;创建队列。处理OutputDataReceived事件;并启动控制台应用程序进程。
  • 事件处理程序不应使用Dispatcher.Invoke更新队列。应该使用直接线程安全调用。
  • 在更新UI时,确实需要使Queue处于非阻塞状态,但是我实际上没有足够的信息来实现对注释的实现方式。

  • 希望这可以帮助
    -克里斯

    关于multithreading - 从控制台应用程序读取输出和WPF绘图异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054037/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com