2017-08-28 14 views
0

でテキストを書き込むしようとすると、私は他のテストが実行されている間にバックグラウンドでテキストファイルにデータを取得しようとしている - 同期タスクはOK作品としてそれを実行する非同期タスク

public void main() 
{ 
    GetData() 
    ...Starting tests..... 
} 
public async Task GetData() 
{ 
    await Task.Run(()=> 
    { 
     string path = "" + ResultsPath + "\\Telemes.txt"; 
     File.WriteAllText(Path , string.Join("," , Meas().Keys) + "\r\n"); 
     while(true) 
     { 
      File.AppendAllText(path , string.Join(",", Meas().Values)); 

      if(tokenSource.IsCancellationRequested) 
      { 
       break; 
      } 
     }}); 
} 

を、私にすべてのデータを取得します私は欲しい。 このように呼び出すと、テキストファイルはまったく作成されませんが、テストはうまくいきます。

私はタスクを適切に呼び出すつもりはないと思います。間違いはどこですか?

+1

'GetData'によって作成されたタスクが完了するのを待つことは決してありません。これがコンソールアプリケーションの場合、 'GetData'で作成されたバックグラウンドスレッドが起動する前に終了します。 –

+0

メインは長く続きますか?メインがほとんど動作しない場合、タスクが実行される前に終了することがあります。終了する前にタスクを待つことをお勧めしますので、作業を完了するチャンスがあります。 –

+1

このコードには多くの問題があります。まず、非同期ではありません。新しいスレッドを使用して*同期的に*書きます。次に、タスクをスレッドのように使用します。無限ループを使用してデータを読み書きします。タスクは*単一*実行であるはずです。あなたはタスクのステータスをチェックしないので、例外が失われます。たとえば、 'Meas()'は何かを返しますか?スレッドが最初に呼び出されたときにnullになることはありますか? –

答えて

0

メインメソッドでタスクを待つ必要があります。以下のようなもの:

public async void main() 
{ 
    Task getDataTask = GetData(); 
    ...Starting tests..... 
    //Do something that is not dependent upon GetData() 
    await getDataTask; 
    //Processing completed 
    Console.Write("File GetData - complete"); 
} 

注:main()メソッドもasyncにする必要があります。