Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

async function not launching asynchronously

I still meet issues calling async functions.
In that code, I execute generateAllIfcs(dataFolder), then I would like to execute already addToExistingContract() or this.importNewContract() depending on contexte.SourceContract.
But this line is not reached until generateAllIfcs(dataFolder) is finished.

private async void Import(object sender, RoutedEventArgs e)
{
    Task<bool> successGenerateIfc = this.generateAllIfcs(dataFolder);
    Task<bool> successAddContractToVsteel = contexte.SourceContract != null ? this.addToExistingContract() : this.importNewContract();
    await Task.WhenAll(successGenerateIfc, successAddContractToVsteel);
}
private async Task<bool> generateAllIfcs(string dataFolder)
{
    try
    {
        var progressIndicator4 = new Progress<int>(contexte.ReportProgress4);
        if (contexte.SourceContract != null)
        {
            int total4 = await contexte.NewModel.ExportNewIfcContract(contexte.SourceContract, progressIndicator4, 0, 100, contexte.SelectedConfigImportIFC, true,dataFolder);
        }
        else
        {
            int total4 = await contexte.NewModel.ExportNewIfcContract(null, progressIndicator4, 0, 100, contexte.SelectedConfigImportIFC, true,dataFolder);
        }
        return true;
    }
    catch
    {
        return false;
    }
    
}
 public async Task<int> ExportNewIfcContract(Contract existingContract, IProgress<int> progress, int startProgress, int endProgress, ConfigImportIFC config,bool generateIfcAssAndRep, string dataFolder)
{
    int retour = await this.exportNewIfcContract(existingContract, progress,startProgress,endProgress,config, generateIfcAssAndRep,dataFolder);
    return retour;
}
private async Task<int> exportNewIfcContract(Contract existingContract, IProgress<int> progress,int startProgress,int endProgress,ConfigImportIFC config, bool generateIfcAssAndRep,string dataFolder)
{
    //some other calls to async functions
}

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

"async function not launching asynchronously" – yes, that’s normal; async isn’t about how things launch, it is about how they complete (or at least, continue); async doesn’t mean "parallel", "concurrent", etc – and has only tangential relationship to threading; an async method runs synchronously until the first incomplete await, i.e. where the thing being awaited did not itself finish synchronously. Only for an incomplete await does the async engine unroll itself and register a continuation. I don’t see anything inherently truly async in your code, although to be fair: I can’t see exportNewIfcContract.

If you want concurrency, consider Task.Run etc to invoke a second execution flow. Or alternatively, consider adding:

await Task.Yield();

at the top of generateAllIfcs (the method that you intend to run concurrently); Task.Yield() always returns in an incomplete state, pushing the rest of the work as a continuation onto the thread-pool.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading