Bagikan melalui


Mengelola beberapa utas dalam kode terkelola

Jika Anda memiliki ekstensi VSPackage terkelola yang memanggil metode asinkron atau memiliki operasi yang dijalankan pada utas selain utas UI Visual Studio, Anda harus mengikuti panduan yang diberikan di bawah ini. Anda dapat menjaga utas UI tetap responsif karena tidak perlu menunggu pekerjaan di utas lain selesai. Anda dapat membuat kode Anda lebih efisien, karena Anda tidak memiliki utas tambahan yang memakan ruang tumpukan, dan Anda dapat membuatnya lebih andal dan lebih mudah di-debug karena Anda menghindari kebuntuan dan kode yang tidak responsif.

Secara umum, Anda dapat beralih dari utas UI ke utas yang berbeda, atau sebaliknya. Ketika metode kembali, utas saat ini adalah utas tempat awalnya dipanggil.

Penting

Panduan berikut menggunakan API di Microsoft.VisualStudio.Threading namespace layanan, khususnya, JoinableTaskFactory kelas . API di namespace ini baru di Visual Studio 2013. Anda bisa mendapatkan instans JoinableTaskFactory dari ThreadHelper properti ThreadHelper.JoinableTaskFactory.

Beralih dari utas UI ke utas latar belakang

  1. Jika Anda berada di utas UI dan ingin melakukan pekerjaan asinkron pada utas latar belakang, gunakan Task.Run():

    await Task.Run(async delegate{
        // Now you're on a separate thread.
    });
    // Now you're back on the UI thread.
    
    
  2. Jika Anda berada di utas UI dan ingin memblokir secara sinkron saat Anda melakukan pekerjaan pada utas latar belakang, gunakan properti TaskScheduler.Default di TaskScheduler dalam Run:

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

Beralih dari utas latar belakang ke utas UI

  1. Jika Anda berada di utas latar belakang dan ingin melakukan sesuatu di utas UI, gunakan SwitchToMainThreadAsync:

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

    Anda dapat menggunakan SwitchToMainThreadAsync metode untuk beralih ke utas UI. Metode ini memposting pesan ke utas UI dengan kelanjutan metode asinkron saat ini, dan juga berkomunikasi dengan sisa kerangka kerja utas untuk mengatur prioritas yang benar dan menghindari kebuntuan.

    Jika metode utas latar belakang Anda tidak asinkron dan Anda tidak dapat membuatnya asinkron, Anda masih dapat menggunakan await sintaks untuk beralih ke utas UI dengan membungkus pekerjaan Anda dengan Run, seperti dalam contoh ini:

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