2016-04-11 24 views
0

メソッドをPrintOrderAsyncで実行すると、注文を印刷できます。 方法PrintOrderAsyncのコードは構文エラー タスク非同期と待ち受け

public async Task<string> PrintOrderAsync(string PrintExe, string ExePath, int nOrderNo) 
{ 
    await Task.Factory.StartNew(() => Process.Start(ExePath + PrintExe, nOrderNo.ToString())); 

     return ""; 
} 

は表示されません。しかし、私は、呼び出し元のメソッドの構文に苦しんでいます。ここで私が試したものです:

Task<string> result = PrintOrderAsync(PrintExe, ExePath, nOrderNo); 

私は上記の行に構文エラーが表示されます。私は何が欠けていますか?

+1

なぜあなたは 'StartNew'を使うのですか?あなたはどこかの例としてそれを見ましたか? –

+0

@StephenClearyはい、私はこれをどこかで見ました。しかし、私は耳を傾けています。コードが変更に合わせてうまくいくと思ったら、教えてください。 – Hidalgo

+0

@StephenCleary質問をしたところで、StartNewでラインをどのように変更/最適化できるのかを調べようとしていますが、これを理解できません。明らかに私の構文に何か間違いがあるので、よりうまく動作させる方法を学ぶ必要があります。 – Hidalgo

答えて

2

を試してみてください。実際にはプロセスの結果を待っているわけではありません。実際には、プロセスが終了するのを待たない限り、asyncawaitのキーワードにかかわらず、火災と忘れです。これを行うには、いくつかの方法があります。たとえば

public static Task WaitForExitAsync(this Process process, 
    int milliseconds, 
    CancellationToken cancellationToken = default(CancellationToken)) 
{  
    return Task.Run(() => process.WaitForExit(milliseconds), cancellationToken); 
} 

、ここにあなたがTaskでプロセスの待機をラップするために使用できる拡張メソッドです。次に、それを次のように待っていたことができます:;:

Process.Start(ExePath + PrintExe, nOrderNo.ToString()) 

public async Task PrintOrderAsync(string PrintExe, string ExePath, int nOrderNo) 
{ 
    return Process.Start(ExePath + PrintExe, nOrderNo.ToString()) 
        .WaitForExitAsync(5000); 
} 

// Then you could await it wherever... 
await PrintOrderAsync(PrintExe, ExePath, nOrderNo); 

また、あなたはそれが完了するまで待機したくない場合(つまり、あなたが今持っているようにあなたは、火をたいと忘れて)これを行います

Taskなどで包んではいけません。とにかく(個人的には、私が最初に共有したオプションが好きです)、全く別のプロセスです。

+0

David、最初に投稿とコードをありがとう。何かが私を混乱させます(それは私です、もちろんです)。私が非同期を使用せずに(指摘どおりに)、単に Process.Start(ExePath + PrintExt、nOrderNo.ToString())でプロセスを開始すると、このプロセスは"メイン"コードと "メイン"コードはプロセスが終了するのを待たなければなりませんか?つまり、非同期と待機を使用する理由は、プロセスを新しいスレッドに「移動」させ、「メイン」スレッドを「フリー」にして続行することだと私は考えました。偽の論理? :) – Hidalgo

+1

全く新しいプロセスを開始し、それを開始したコードから完全に切り離されています。これを試して、 'Process.Start(" notepad ")'を実行する単純なコンソールアプリケーションを記述してください。そして、すぐにコンソールアプリを終了する - メモ帳は開いたままで、それ自身のプロセスで起動されます。実際、これらの2つのプロセスはスレッドを全く共有できません。 –

+0

David、ありがとう。あなたが正しいです。うまくいけば、非同期と待機を使用する方法を学ぶことの完全な練習は、時間の完全な無駄ではありませんでしたし、私はある時点でそれを使用するようになるでしょう。 – Hidalgo

1

はあなたがプロセスを開始している、ここで共有しているコードに基づいて

string result = await PrintOrderAsync(PrintExe, ExePath, nOrderNo); 
+0

M Tovbin、私は私がここで育てたトピックについてほとんど何も知らないことを認めます。したがって、あなたの構文を使用する上での違いが何であるか分かりません。 Task.Factory.StartNew(()=> Process.Startを待ちます。 待ち時間のあるタスクを実行すると、ご提案いただきありがとうございます。 – Hidalgo

+1

Factory.StartNewは新しいスレッドをスピンアップし、Processを実行します。そのスレッドで起動します。新しいスレッドをスピンアップすると、現在のスレッドは解放されます。PrintOrderAsyncメソッドは文字列のTaskを返すので、呼び出しを行うときにはPrintOrderAsyncを待機し、その結果を文字列変数に代入する必要があります。 –

+0

M Tovbin、説明をありがとうございました。しかし、私は私のコードを変更するとき "仕事結果= PrintOrderAsync(PrintExe、ExePath、nOrderNo);"あなたのコードで "string result = await PrintOrderAsync(PrintExe、ExePath、nOrderNo);" "await演算子はasyncメソッド内でのみ使用できます。このメソッドを 'async'修飾子で作成し、戻り値の型を 'Task'に変更することを検討してください。 – Hidalgo

関連する問題