2013-01-24 41 views
1

我想使用异步并等待,而我的问题是它不会等待后台进程完成。也许你想知道为什么我不能同步运行应用程序? 我想尽快完成我的任务的一部分,其余的可以等待,如本例中所示。 谢谢你们的帮助! =)如何知道使用异步时Task或Void方法是否仍在运行

class Program 
{ 
    static void Main(string[] args) 
    { 
     Run(); 
     //Problem or Maybe Not? Needs this 
     //So that my application won't close immediately 
     Console.ReadLine(); 
    } 

    private async static void Run() 
    { 
     Task<bool> TBool = ProcessRecords(); 

     if (await TBool) 
     { 
      //Problem #1 This Line Doesn't Show 
      Console.WriteLine("End of Code"); 
      //SHould be safe to close the application by Now 
      //But goes through here not waiting for the return 
      //of the last process. 

      Environment.Exit(0); 

      //My temporary solution is to indicate a Task.Delay(80000) 
      //to make sure that all the logging in the background 
      //are all done. I dont know if there is a function that shows 
      //that there are task running on the background or any 
      //other workaroung will help. =) thanks 
     } 

    } 

    private async static Task<bool> ProcessRecords() 
    { 
     Task newTask = null; 
     //Loop through all the records and send 
     //all the records to MQ ASAP 
     for (int x = 0; x < 10; x++) 
     { 
      //I wont wait for this Task so 
      //I can send the next record 
      newTask = SendToMQ(x); 
     } 
     //I only need to wait for the last Task to 
     //indicate that I can exit the system 
     //as soon as it finish 
     //Problem #2 The Console.WriteLine doesnt show the last record. 
     await newTask; 
     return true; 
    } 

    private async static Task SendToMQ(int count) 
    { 
     //actual sending of message (Important) 
     await Task.Delay(1000); 
     //Process of Logging Connect to DB etc, (Not so Important, but takes most of the time) 
     await LoggingRecord(); 
     Console.Clear(); 
     Console.WriteLine("Done Processing " + count.ToString() + " records"); 
    } 

    //Logging of each record 
    private async static Task LoggingRecord() 
    { 
     await Task.Delay(5000); 
     //Problem #3 This Line Doesn't Show 
     Console.WriteLine("Last Log Finished"); 
    } 
} 
+0

你能不能设置一些布尔标志或分配和检查某些属性..?当你通过代码的时候会发生什么,最后的日志完成写入控制台主窗口..? – MethodMan

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

显然Logging没有完成他的事情,但应用程序强制关闭整个应用程序,即使Logging尚未完成写入,这就是为什么我给我的应用程序Task.Delay(8000)等待它登录,但这不仅仅是好的编码,也不是动态的。感谢所有的帮助=) –

回答

1

你应该用等待尽可能:

await Run(); 

然而,在这种情况下,你不能,那么你必须使用等待

static void Main(string[] args) 
{ 
    Run().Wait(); 

    //Problem or Maybe Not? Needs this 
    //So that my application won't close immediately 
    //Console.ReadLine(); 
} 

// note the return type is Task 
private async static Task Run() 
{ 
... 
} 

在ProcessRecords()你有以下行 - 我不太清楚你的意思,所以我没有解决它:

//Problem #2 The Console.WriteLine doesnt show the last record. 

上面打印出

Done Processing 9 records 
End of Code 
+0

谢谢,我是如此陷入使用void而不是它应该是任务,无效没有Wait()。感谢您的新洞察=)。 –

+1

虽然这是一个适用于控制台应用程序的正确解决方案,但在GUI应用程序或ASP.NET中使用Wait()会非常小心,但它几乎总是会导致死锁。 – svick

相关问题