// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqTaskLongRunningAsyncTask
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqTaskLongRunningAsyncTask
:description: Apache NetBeans wiki DevFaqTaskLongRunningAsyncTask
:toc: left
:toc-title:
:syntax: true

== How to execute a long running task from an action without blocking the GUI?

The easy way if you might need to run a long task when some action is involved:

[source,java]
----

@ActionRegistration(asynchronous = true)
...
public void actionPerformed(ActionEvent ev) {
    if (isLongTaskRequired) {
        // maybe run a ProgressHandler
        doLongTask();
    }
    EventQueue.invokeLater(new Runnable() {
        @Override public void run() {
            // do domething with the gui
        }
    });
}
----

This way you don't even need to care about threading yourself, GUI will be updated as long as the task is finished.

Taken from dev@platform.netbeans.org (Oct 2013)

== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqTaskLongRunningAsyncTask[http://wiki.netbeans.org/DevFaqTaskLongRunningAsyncTask] , 
that was last modified by NetBeans user Markiewb 
on 2013-10-03T17:04:13Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
