У меня есть консольное приложение, которое выводит около 160 строк информации каждую 1 секунду.
Вывод данных - это точки, которые можно использовать для построения графика на графике.
В моем приложении WPF я успешно подключил это, и вывод данных консольным приложением отображается, однако после примерно 500 точек данных я вижу значительное замедление в приложении иБлокировки потока пользовательского интерфейса.
Я предполагаю, что это связано с асинхронными операциями, которые я использую:
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);
}
}
_readings
- это пользовательский ObservableQueue<Queue>
, определенный в в этом ответе .Я изменил его так, чтобы в очереди одновременно могло быть только 50 элементов.Поэтому, если добавляется новый элемент и число очередей> = 50, Dequeue()
вызывается перед Enqueue()
.
. Есть ли способ улучшить производительность или я обречен из-за того, каксколько выводит консольное приложение?