dar*_*ixx 2 .net c# async-await
我希望这里有一个简单的答案,这可能是由于我对异步操作的误解...
我有一种方法可以手动启动,也可以在程序加载时自动启动。当手动调用(按下按钮)时,async方法工作完美。但是,当自动加载该方法时,似乎只是跳过该方法的主要“ await”部分而不执行任何工作,而是直接跳到最后。
整个过程从以下方法开始:
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.");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
如果_config.AutoStart为true,则BatchTransfer方法似乎不执行任何操作,而是程序直接跳到该CompleteBatch()方法。如果手动调用,一切都会按预期进行。
奇怪的是,如果我await BatchTransfer(batchSize)在自动启动方法中设置了一个断点,则可以单步执行代码并进行批量传输。因此,当调试时它起作用,而当不调试时就不起作用。请帮忙!
这是因为 -
Task.Factory.StartNew(async () =>
{
await BatchTransfer(batchSize);
CompleteBatch();
});
Run Code Online (Sandbox Code Playgroud)
您正在等待内部任务完成,await但是Task.Factory.StartNew(async () =>它本身是一个异步任务,并且尚未等待。您还应该这样等待Task.Factory.StartNew(async () =>-
await Task.Factory.StartNew(async () =>
Run Code Online (Sandbox Code Playgroud)
在调试时,将保留调用内部任务的单独线程,您可以看到执行情况,但是在正常运行时,后台仍在工作,但由于没有等待,所以看不到它Task.Factory.StartNew(async () =>。
如果您检查线程池和线程ID,我相信您会在调试时看到它们是不同的。
该博客可能会帮助您了解情况-http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx
| 归档时间: |
|
| 查看次数: |
1773 次 |
| 最近记录: |