C#等到它完成

时间:2015-05-27 14:54:59

标签: c# winforms

我有一些代码,我注意到它会让我的应用程序冻结。我正在寻找一种比我更好的解决方案。

如何等待我收到的时候我不知道的值,在得到它们之前我无法继续,只有我想到的解决方案才会使用,直到我收到这些值。

我正在寻找更好的解决方案。如果它不会冻结我的应用程序是最好的。有人告诉我,我应该使用事件,但我无法弄清楚如何做到这一点。

IsBusy = true;            
do
{
  if (IsBusy)
  {
    //waiting for values which i don't know when i receive
    //i can receive those values in 1sec and also in 2 min

    if done -> IsBusy = false;
  }

  Thread.Sleep(2000);

} while (IsBusy);


IsBusy = true;
do
{
  if (IsBusy)
  {
   //waiting for similar thing until i receive it

   if done -> IsBusy = false;
  }

  Thread.Sleep(5000);

} while (IsBusy);  

2 个答案:

答案 0 :(得分:1)

我认为使用异步等待的最佳方法。在C#中,使用异步等待进行异步编程非常容易。代码看起来像是同步的。

private async void StartButtonClick(object sender, RoutedEventArgs e)
{
   // Starting new task, function stops
   // the rest of the function is set to cont
   // UI not blocked
   Task.Run(async () =>
   {
        var MyValue = await doSomethingAsync();

    }); //there you waiting value

   //continue code
}

答案 1 :(得分:1)

可能有几种可能性,虽然你所等待的描述很模糊,但我们可能无法指出你的具体方向。可能有用的一些事情是:

  1. 基于事件的编码。如果您可以更改您正在等待的进程的代码,则可以让它引发您的调用代码然后处理的事件。 This other SO answer有一个简单,完整的C#程序,可以引发和处理事件。
  2. 根据我的经验,
  3. BackgroundWorker 在Windows窗体项目中经常运行良好。根据我的经验,这是开始使用多线程的简单方法之一。有一个评价很高的tutorial with code samples here可能有帮助。
  4. 还有其他方法可以多线程化你的代码(这样你在等待时就不会“冻结”),但这些可能是你做所需的更简单的起点。

    Async / await 可能会为您工作,但我发现当您已经有一个现有的doSomethingAsync()类型方法可以使用它们时它们最有用(例如.NET生成的代理中的异步Web / WCF服务方法)。但是,如果所有代码都是您自己的,并且您尝试从头开始多线程,那么它们将不是您用来开始的中心机制。 (当然,如果事实证明 正在等待内置...Async()方法(如Web服务调用)的某些内容,请务必使用async / {{1 ,请选择@Astemir-Almov作为接受的答案!)