2015-11-10 38 views
2

我正在創建一個Windows 10通用應用程序,其中程序在WebView(單頁面AngularJS應用程序)中運行,Windows應用程序通過WebView與它通信。當應用程序處於前臺時,則沒有問題,但我必須從BackgroundTask調用JavaScript函數。在BackgroundTask中運行WebView

正如我所見,如果在構造函數中將ExecutionMode屬性設置爲SeparateThread,在Windows 10中有可能在獨立線程而不是UI線程中運行WebView。我試圖在BackgroundTask中使用這個方法,但我仍然得到了一個異常,我試圖創建一個編組在另一個線程上的對象。

這裏有一個代碼片段:

public void Run(IBackgroundTaskInstance taskInstance) 
{ 
    var deferral = taskInstance.GetDeferral(); 

    var tmp = WebView.DefaultExecutionMode; 
    var webView = new WebView(WebViewExecutionMode.SeparateThread); 
    var notificationService = new NotificationService(new BrowserBase { Browser = webView, IsOnUIThread = false }); 
     notificationService.Notification("ExampleCall"); 

    deferral.Complete(); 
} 

我查了一些其他的事情。我只是把佈局中的按鈕,並綁定該RelayCommand它:

public RelayCommand Test 
{ 
    get 
    { 
     return new RelayCommand(() => 
     { 
      Task.Run(() => 
      { 
       var tmp = new WebView(WebViewExecutionMode.SeparateThread); 
       tmp.Navigate(_appBaseUri); 
      }); 
     }); 
    } 
} 

正如所看到的,我在非UI線程創建的WebView的實例,但我仍然有例外,甚至強硬創建的WebView在單獨的線程上運行。

有沒有辦法做到這一點?我目前正在研究,所以我接受任何幫助或想法。

回答

0

有一個誤解。您必須在UI線程上創建WebView。

SeparateThread執行模式意味着webview將處理和顯示非UI線程上的內容,以提高特定場景的性能。這不是讓你開始一個新的線程,並創建webview實例。線程自動創建,您將無法管理它。

如果我們有一個繁忙的用戶界面,並且我們有很多內容要加載,爲了避免在UI上被阻塞,我們可能會啓動一個新的線程來加載數據並首先顯示控件。這使得用戶界面響應。實際上,SeparateThread執行模式也做類似的事情。

所以你需要UI線程活着。

+0

非常感謝您的回答。當我昨天做了一些進一步的研究時,我也遇到了同樣的情況。這非常不幸,因爲如果我能夠在非UI線程中創建一個webView,這對我來說會容易得多,因爲我必須在網頁上運行JS ServiceCalls。現在,我必須找到一個解決方法。你有沒有關於如何在非UI線程上運行來自某個網​​頁的JavaScript的建議?如果有幫助,我也有網頁的完整sourceCode。 – IThomas91

+0

您是否找到解決此問題的解決方案? – yalematta