2017-12-11 1 views
0

Ich arbeite an einem Projekt, das den Frame vom Server abrufen und auf der Benutzeroberfläche anzeigen muss. Also habe ich diese Methode benutzt, um es kontinuierlich zu bekommen. Aber die ganze Methode läuft auf UI-Thread, so dass es meine Benutzeroberfläche ein wenig blockiert. Haben wir irgendeine Möglichkeit, alle Methoden, die auf dem anderen Thread ausgeführt werden, auszuführen und das Ergebnis zurückzugeben, um die folgenden drei Codezeilen im UI-Thread zu aktualisieren.Ergebnis aus Hintergrundthread abrufen und auf UI-Thread fortlaufend aktualisieren UWP

Hinweis: Ich habe versucht, alle Methode von Task.Factory.StartNew und drei Zeilen unten mit Dispatcher.RunAsync, aber kein Glück zu decken. Weil der Rückgabewert null ist.

//width = 1280, height = 960 
private async Task DisplayPreviewTwocamera_Camera1(int width, int height) 
{ 
    _isPreviewing = true; 
    try 
    { 
     byte[] buffer; 
     SoftwareBitmap softwareBitmap; 
     SoftwareBitmapSource _imageSource; 
     while (true) 
     { 
      if (_isMinimize) 
      { 
       return; 
      } 
      buffer = await StreamServiceHandler.Instance.GetStreamCamera_First_1(); 
      if (buffer.Length == 0) 
      { 
       buffer = null; 
       continue; 
      } 
      softwareBitmap = SoftwareBitmap.CreateCopyFromBuffer(buffer.AsBuffer(), BitmapPixelFormat.Gray8, width, height); 
      buffer = null; 
      if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8 || 
       softwareBitmap.BitmapAlphaMode == BitmapAlphaMode.Straight) 
      { 
       softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); 
      } 
      //three lines of code below need to run in UI thread 
      _imageSource = new SoftwareBitmapSource(); 
      await _imageSource.SetBitmapAsync(softwareBitmap); 
      image_TwoCamera_Camera_1.Source = _imageSource; 
     } 
    } 
    catch (Exception exception) 
    { 
     Debug.WriteLine(exception); 
    } 
} 
+0

Können Sie die ganze Klasse zu veröffentlichen, oder pat, wo Sie Aufruf an DisplayPreviewTwocamera_Camera1 – Isma

+0

Ich rufe es von onNavigateTo() -Methode ohne abwarten. Ich lass es einfach brennen und vergaß –

+0

Das ist, was den Thread dann blockiert, wenn Sie diesen Teil teilen, könnte ich in der Lage sein, ein Beispiel zur Verfügung zu stellen. – Isma

Antwort

0

Die Art und Weise mit ausgeführt wird, die nicht IU Logik in separaten Thread behandeln und dann die UI-Thread aufrufen, sie aktualisieren:

await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
       () => { 
// UI THREAD 
}); 
Verwandte Themen