1

一个小的n00b问题我还是看不懂,很多StackOverflow的答案。

colorData变量是由 Kinect 以 25 次/秒的速度更新的字节数组。没有 UI 组件。

我认为 WriteableBitmap 和 WritePixels 在同一个任务的线程中被调用。但我仍然得到 System.InvalidOperationException。如果为每个循环创建一个新的 WriteableBitmap,则没有错误。

应该如何修复我的代码以有效地重用我的 WriteableBitmap ?

private async Task DoJob(TimeSpan dueTime, TimeSpan interval, CancellationToken token) {

  if (dueTime > TimeSpan.Zero)
    await Task.Delay(dueTime, token);

  WriteableBitmap bitmap = NewColorBitmap(colorW, colorH);

  // Repeat this loop until cancelled.
  while (!token.IsCancellationRequested) {

    try {
      bitmap.WritePixels(
        new Int32Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight),
        colorData, bitmap.PixelWidth * Bgra32BytesPerPixel, 0);
    } 
    catch(Exception ex){
      // System.InvalidOperationException: 
      // The calling thread cannot access this object 
      // because a different thread owns it.
    }

    // Wait to repeat again.
    if (interval > TimeSpan.Zero)
      await Task.Delay(interval, token);
    }
}
4

2 回答 2

0

调用 WriteableBitmap.WritePixels 方法

检查高度和宽度的值。也许字节数组根本不够大!而stride是从内存中的一行像素到内存中的下一行像素的字节数。

于 2013-09-13T06:27:54.907 回答
0

因为 WriteableBitmap 绑定到 WPF 渲染线程,所以我必须为进程间通信做复杂的代码。

所以我不再使用它,而是使用来自 Emgu CV(Open CV)的 Image,它也有更好的性能。

于 2013-08-14T20:51:45.343 回答