我希望这里有一个简单的答案,这可能是由于我对异步操作的误解...
我有一种方法可以手动启动,也可以在程序加载时自动启动。手动调用(按下按钮时),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题解计算机为什么是基于二进制的?可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制