Yönetilen kodda birden çok iş parçacığını yönetme

Zaman uyumsuz yöntemleri çağıran veya Visual Studio UI iş parçacığı dışındaki iş parçacıklarında yürütülen işlemlere sahip yönetilen bir VSPackage uzantınız varsa, aşağıda verilen yönergeleri izlemeniz gerekir. Başka bir iş parçacığında çalışmanın tamamlanmasını beklemesi gerekmeyen ui iş parçacığının yanıt vermesine devam edebilirsiniz. Yığın alanı kaplayan ek iş parçacıklarınız olmadığından kodunuzu daha verimli hale getirebilir ve kilitlenmelerden ve yanıt vermeyen kodlardan kaçındığınızdan hata ayıklamayı daha güvenilir ve kolay hale getirebilirsiniz.

Genel olarak, kullanıcı arabirimi iş parçacığından farklı bir iş parçacığına (veya tersi) geçiş yapabilirsiniz. Yöntemi döndürdüğünde, geçerli iş parçacığı başlangıçta çağrıldığı iş parçacığıdır.

Önemli

Aşağıdaki yönergeler, ad alanında Microsoft.VisualStudio.Threading , özellikle de sınıfındaki API'leri JoinableTaskFactory kullanır. Bu ad alanında bulunan API'ler Visual Studio 2013'te yenidir. özelliğinden ThreadHelper.JoinableTaskFactorybir JoinableTaskFactory örneğini ThreadHelper alabilirsiniz.

Kullanıcı arabirimi iş parçacığından arka plan iş parçacığına geçme

  1. UI iş parçacığındaysanız ve arka plan iş parçacığında zaman uyumsuz iş yapmak istiyorsanız kullanın Task.Run():

    await Task.Run(async delegate{
        // Now you're on a separate thread.
    });
    // Now you're back on the UI thread.
    
    
  2. Ui iş parçacığındaysanız ve arka plan iş parçacığı üzerinde çalışma yaparken zaman uyumlu olarak engellemek istiyorsanız içindeki özelliğini TaskScheduler.Default RunkullanınTaskScheduler:

    // using Microsoft.VisualStudio.Threading;
    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        await TaskScheduler.Default;
        // You're now on a separate thread.
        DoSomethingSynchronous();
        await OrSomethingAsynchronous();
    });
    

Arka plan iş parçacığından UI iş parçacığına geçme

  1. Arka plan iş parçacığı kullanıyorsanız ve kullanıcı arabirimi iş parçacığında bir şey yapmak istiyorsanız kullanın SwitchToMainThreadAsync:

    // Switch to main thread
    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
    

    Ui iş parçacığına geçmek için yöntemini kullanabilirsiniz SwitchToMainThreadAsync . Bu yöntem, geçerli zaman uyumsuz yöntemin devamı ile ui iş parçacığına bir ileti postalar ve ayrıca doğru önceliği ayarlamak ve kilitlenmeleri önlemek için iş parçacığı çerçevesinin geri kalanıyla iletişim kurar.

    Arka plan iş parçacığı yönteminiz zaman uyumsuz değilse ve zaman uyumsuz hale getiremiyorsanız, bu örnekte olduğu gibi çalışmanızı ile Runkaydırarak ui iş parçacığına geçmek için söz dizimini kullanmaya await devam edebilirsiniz:

    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        // Switch to main thread
        await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
        // Do your work on the main thread here.
    });