异步等待执行顺序-代码仅在逐步执行/调试时才有效 - c#

我希望这里有一个简单的答案,这可能是由于我对异步操作的误解...

我有一种方法可以手动启动,也可以在程序加载时自动启动。手动调用(按下按钮时),async方法可以完美工作。但是,在自动加载时,该方法似乎只是跳过该方法的主要“等待”部分而无需执行任何工作,而是直接跳到最后。

整个过程从以下方法开始:

private void StartBatch()
{
    var batchSize = (int)BatchSizeSlider.Value;

    if (_config.AutoStart)
    {
        ExecutionLogAddItem(string.Format("Auto batch processing started (batch size: {0})", batchSize.ToString()));

        Task.Factory.StartNew(async () =>
        {
            await BatchTransfer(batchSize);
            CompleteBatch();
        });
    }
    else
    {
        var start = ConfirmStartBatch();
        var doBatch = start.ContinueWith(async (continuation) =>
        {
            //start task
            if (start.Result == true)
            {
                ExecutionLogAddItem("Batch processing started.");
                ExecutionLogAddItem(string.Format("Batch size set at {0}", batchSize.ToString()));
                await BatchTransfer(batchSize).ContinueWith((x) => CompleteBatch());
            }
            else
            {
                ExecutionLogAddItem("Batch processing aborted.");
            }
        });    
    }
}

如果_config.AutoStart为true,则BatchTransfer方法似乎不执行任何操作,而是直接跳到CompleteBatch()方法。如果手动调用,一切都会按预期进行。

奇怪的是,如果我在自动启动方法中的await BatchTransfer(batchSize)上设置了一个断点,则可以单步执行代码并进行批量传输。因此,当调试时它起作用,而当不调试时就不起作用。请帮忙!

参考方案

这是因为 -

Task.Factory.StartNew(async () =>
    {
        await BatchTransfer(batchSize);
        CompleteBatch();
    });

您正在等待内部任务用await完成,但是Task.Factory.StartNew(async () =>本身是异步任务,因此未等待。您还应该这样等待Task.Factory.StartNew(async () =>-

await Task.Factory.StartNew(async () =>

在调试时,将保留调用内部任务的单独线程,您可以看到执行情况,但是在正常运行时,后台仍在工作,但是由于您没有等待Task.Factory.StartNew(async () =>,所以看不到它。

如果您检查线程池和线程ID,我相信您会在调试时看到它们是不同的。

该博客可以帮助您了解情况-http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

多重处理:map与map_async - python

使用map和map_async有什么区别?将列表中的项目分配给4个进程后,它们是否运行相同的功能?因此,假设两者都在异步和并行运行是错误的吗?def f(x): return 2*x p=Pool(4) l=[1,2,3,4] out1=p.map(f,l) #vs out2=p.map_async(f,l) python大神给出的解决方案 将作业映射到流程…

等待异步方法中已完成的任务 - c#

当我们调用异步方法时,我们返回一个包装器任务。public async Task ExecuteActionAsync() { // no await called } public async Task ExecuteActionAwaitAsync() { // await called on a completed await Task.Complet…

了解C#等待运算符 - c#

我只是对C#的异步编程有一些基本的了解。据我了解,这段代码statement1; await statement2(); statement3; statement4; 在逻辑上应等效于statement1; var awaiter = statement2().GetAwaiter(); awaiter.OnCompletion(() => { aw…

等待Task.CompletedTask是否意味着async方法将同步运行? - c#

static async Task WaitTaskCompleted() { //Use Thread A before await Task.CompletedTask await Task.CompletedTask; //Will the code after await Task.CompletedTask always use Thread A,…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制