2016-10-31 1 views
0

私はカスタムVisual Studio拡張を作成しています。初期化コードでは、非同期WebRequestをリモートエンドポイントにするためにasync-awaitを使用します。Visual Studio拡張パッケージは非同期操作をサポートしますか

問題は、私がawaitステートメントを呼び出すと、カスタム拡張の初期化の実行が中止され、決してそれに戻ってこないということです。私は、VS拡張モジュールの初期化コードが何らかの形で非同期プログラミングに関係すると思われます。誰が私になぜこれが起こっているのかを説明することができれば、私はそれを高く評価します。

+0

を動作させるためMicrosoft.VisualStudio.Shell.Interop.14.0.DesignTimeへの参照を追加する必要があります。例外をチェックしてください。 – SLaks

+1

コンソールアプリケーション* async *のMain()エントリポイントを作成しようとするのと基本的に異なるわけではありません。コンパイラは間違いを検出できます。しかし、拡張のためにすることはできません、それは豆VS拡張の初期化の意味を知らない。継続を待っていることを確実にするために必要な配管は、単に欠落しているだけです。今日ではなく、いつか変わるかもしれません。 –

+0

@HansPassant:実際には、 'async void'拡張子イニシャライザが動作するでしょう。それは良い考えではないでしょう、それは例外を飲み込むだろうが、AFAIK、TaskSchedulerはそれをまだ続けるべきです。 – SLaks

答えて

3

パッケージの非同期読み込みを可能にするAsyncPackageという新しいパッケージがあります。それはAsyncInitializeを持っています。 MSDNから撮影:

あなたは、これは私達にあなたのコードを表示

using System; 
using System.Runtime.InteropServices; 
using Microsoft.VisualStudio; 
using Microsoft.VisualStudio.Shell; 
using System.Threading; 
using System.Runtime.CompilerServices; 
using System.IO; 

namespace asyncpackagetest 
{ 
    [ProvideService((typeof(STextWriterService)), IsAsyncQueryable = true)] 
    [ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string, PackageAutoLoadFlags.BackgroundLoad)] 
    [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)] 
    [Guid(VSPackage1.PackageGuidString)] 
    public sealed class VSPackage1 : AsyncPackage 
    { 

     public const string PackageGuidString = "3dc186f8-2146-4d89-ac33-e216b3ead526"; 

     public VSPackage1() 
     { 

     } 

     protected override async System.Threading.Tasks.Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress) 
     { 
      this.AddService(typeof(STextWriterService), CreateService); 
      await base.InitializeAsync(cancellationToken, progress); 
      ITextWriterService textService = await this.GetServiceAsync(typeof(STextWriterService)) as ITextWriterService; 
      await textService.WriteLineAsync(@"c:\windows\temp\async_service.txt", "this is a test"); 

     } 

     public async System.Threading.Tasks.Task<object> CreateService(IAsyncServiceContainer container, CancellationToken cancellationToken, Type serviceType) 
     { 
      STextWriterService service = null; 
      await System.Threading.Tasks.Task.Run(() => { 
       service = new TextWriterService(this); 
      }); 

      return service; 
     } 

     public class TextWriterService : STextWriterService, ITextWriterService 
     { 
      private Microsoft.VisualStudio.Shell.IAsyncServiceProvider serviceProvider; 
      public TextWriterService(Microsoft.VisualStudio.Shell.IAsyncServiceProvider provider) 
      { 
       serviceProvider = provider; 
      } 
      public async System.Threading.Tasks.Task WriteLineAsync(string path, string line) 
      { 
       StreamWriter writer = new StreamWriter(path); 
       await writer.WriteLineAsync(line); 
       writer.Close(); 
      } 
      public TaskAwaiter GetAwaiter() 
      { 
       return new TaskAwaiter(); 
      } 
     } 
     public interface STextWriterService 
     { 
     } 
     public interface ITextWriterService 
     { 
      System.Threading.Tasks.Task WriteLineAsync(string path, string line); 
      TaskAwaiter GetAwaiter(); 
     } 
    } 
} 
関連する問題