共用方式為


IVsDataHostService.InvokeOnUIThread 方法

同步處理在執行 Visual Studio 處理序的主執行緒上執行指定的方法,以指定的引數清單。

命名空間:  Microsoft.VisualStudio.Data.Core
組件:  Microsoft.VisualStudio.Data.Core (在 Microsoft.VisualStudio.Data.Core.dll 中)

語法

'宣告
Function InvokeOnUIThread ( _
    method As Delegate, _
    ParamArray args As Object() _
) As Object
Object InvokeOnUIThread(
    Delegate method,
    params Object[] args
)
Object^ InvokeOnUIThread(
    Delegate^ method, 
    ... array<Object^>^ args
)
abstract InvokeOnUIThread : 
        method:Delegate * 
        args:Object[] -> Object 
function InvokeOnUIThread(
    method : Delegate, 
    ... args : Object[]
) : Object

參數

  • method
    型別:System.Delegate
    方法的委派,採用和 args 參數中包含者相同的數字和型別的參數。
  • args
    型別:array<System.Object[]
    做為引數傳遞至指定方法的物件陣列。如果方法沒有引數,這個參數可能是 nullNull 參照 (即 Visual Basic 中的 Nothing)。

傳回值

型別:System.Object
Object ,包含所叫用的委派的傳回值,如果委派沒有傳回值,則為 nullNull 參照 (即 Visual Basic 中的 Nothing)。

例外狀況

例外狀況 條件
[any]

指定的方法擲回例外狀況。

備註

這個方法會完成大部分在背景執行緒執行之工作的多執行緒案例中很有用,但定期需要在 UI 執行緒只會執行的程式碼。這類程式碼中存取的全域 Visual Studio 服務,尤其是會實作為單一執行緒 COM 元件在機器碼中。

當呼叫這個方法時,它會將訊息傳送至 UI 執行緒中啟動視窗訊息佇列,在處理呼叫指定的方法。這個方法是同步的,則呼叫執行緒被封鎖,直到 UI 執行緒完成處理方法。

注意事項警告

呼叫這個方法,在 UI 執行緒等候呼叫的執行緒目前鎖定之物件的鎖定在處理序將會造成死結。鎖定的遵循的最佳作法是在多執行緒可幫助降低發生此問題。

範例

下列程式碼示範這個方法的用法說明無法從背景執行緒存取的原生 Visual Studio 服務。

using System;
using System.Threading;
using Microsoft.VisualStudio.Data.Core;
using Microsoft.VisualStudio.Shell.Interop;

public class DdexHostSvcExample7
{
    public static void UpdateUI(IVsDataHostService hostService)
    {
        if (hostService.UIThread == Thread.CurrentThread)
        {
            // Called on UI thread, directly call method
            ActuallyUpdateUI(hostService);
        }
        else
        {
            // Called from background thread, invoke on UI thread
            hostService.InvokeOnUIThread(
                new UpdateUIDelegate(ActuallyUpdateUI),
                hostService);
        }
    }

    private delegate void UpdateUIDelegate(IVsDataHostService hostService);

    private static void ActuallyUpdateUI(IVsDataHostService hostService)
    {
        IVsUIShell uiShell = hostService.GetService<IVsUIShell>();
        uiShell.UpdateCommandUI(0); // fImmediateUpdate == false
    }
}

.NET Framework 安全性

請參閱

參考

IVsDataHostService 介面

Microsoft.VisualStudio.Data.Core 命名空間