首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步并发循环

异步并发循环
EN

Stack Overflow用户
提问于 2014-01-27 15:48:46
回答 2查看 566关注 0票数 0

我试着在后台运行我的windows应用程序。使用从离开应用程序开始的While循环,一切都很好。但是当我再次进入应用程序时,应用程序挂在无限循环中,不会加载。这就是为什么我在while循环中编写了一个条件,但是只要while循环正在运行,就不会考虑其他代码。是否有异步while循环或其他东西来解决这个问题。

下面是我来自App.xaml.cs的代码:

代码语言:javascript
复制
private void Application_Closing(object sender, ClosingEventArgs e)
{
    WhileLoop();
}

private void Application_Activated(object sender, ActivatedEventArgs e)
{
    Continue = false;
}

static bool Continue = false;

void WhileLoop()
{
   Continue = true;
   while(Continue == true)
   {
         //do something in background
   }
}
EN

回答 2

Stack Overflow用户

发布于 2014-01-27 15:52:15

您需要将循环移动到BackgroundWorker上,因为一旦启动while循环,它将占用UI线程中的CPU,这意味着不会处理其他消息,即Application_Activated事件。

问题是,您正在尝试打破一个运行在同一个线程中的无限循环。如果您的while循环位于不同的线程上(即不占用UI线程),那么您的代码应该可以工作。但是,我认为有更好的方法可以不使用

  1. 无限循环
  2. 一个static字段

例如,一种更健壮的方法是在BackgroundWorker上保留对Application_Closing的引用,然后在Application_Activated上调用CancelAsync,这将允许您在BW中使用CancellationPending属性,以便更安全地关闭后台进程。

票数 0
EN

Stack Overflow用户

发布于 2014-01-27 16:15:35

代码语言:javascript
复制
    using System.Threading;

    ManualResetEventSlim waitEvent = new ManualResetEventSlim(false); // start in the unsignaled state

    async void Application_Closing(object sender, ClosingEventArgs e)
    {
        await MyLoop();    // execute asynchronously
        waitEvent.Wait();  // wait for a signal to continue
    }

    void Application_Activated(object sender, ActivatedEventArgs e)
    {
        waitEvent.Reset(); // set unsignaled
    }

    Task MyLoop()
    {
        while(true)
        {
            if(condition)
                break;
        }

        waitEvent.Set(); // signal the app to continue
    }
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21385254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档