gpt4 book ai didi

c# - 异步等待执行顺序 - 代码仅在单步调试/调试时才真正起作用

转载 作者:行者123 更新时间:2023-12-02 15:44:00 26 4
gpt4 key购买 nike

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

我有一个可以手动启动或在程序加载时自动启动的方法。手动调用(按下按钮时)时,异步方法可以完美运行。然而,当自动加载时,该方法似乎只是跳过该方法的主要“等待”部分而不执行任何工作,并直接跳到末尾。

整个过程从这个方法开始:

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

关于c# - 异步等待执行顺序 - 代码仅在单步调试/调试时才真正起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com