我有这个纯粹同步的库.它暴露了同步方法,我有客户端使用它.
对于想要使用它的人,我将底层实现更改为异步和公开的异步方法.但现在我有很多复制代码.异步代码似乎表现更好.我希望现有客户能够利用它,我想消除代码重复.
有没有安全的方法来保持同步签名和调用异步实现?
在打电话时我特别害怕死锁.Result和.Wait.
我有一个关于Task.WaitAll的问题.起初我尝试使用async/await来得到这样的东西:
private async Task ReadImagesAsync(string HTMLtag)
{
await Task.Run(() =>
{
ReadImages(HTMLtag);
});
}
Run Code Online (Sandbox Code Playgroud)
这个功能的内容无关紧要,它同步工作,完全独立于外界.
我这样使用它:
private void Execute()
{
string tags = ConfigurationManager.AppSettings["HTMLTags"];
var cursor = Mouse.OverrideCursor;
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
List<Task> tasks = new List<Task>();
foreach (string tag in tags.Split(';'))
{
tasks.Add(ReadImagesAsync(tag));
//tasks.Add(Task.Run(() => ReadImages(tag)));
}
Task.WaitAll(tasks.ToArray());
Mouse.OverrideCursor = cursor;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,Task.WaitAll如果我以这种方式使用它(使用async/await),我会遇到死锁.我的函数完成它们的工作(所以它们被正确执行),但Task.WaitAll只是永远停留在这里,因为显然ReadImagesAsync不会返回给调用者.
注释行是实际正常工作的方法.如果我对tasks.Add(ReadImagesAsync(tag));线路进行评论并使用tasks.Add(Task.Run(() => ReadImages(tag)));- 一切运作良好.
我在这里错过了什么?
ReadImages方法看起来像这样:
private void ReadImages (string HTMLtag)
{
string section = HTMLtag.Split(':')[0];
string tag = …Run Code Online (Sandbox Code Playgroud)