C# 等待任务<>;。完成后进行冷冻
我正在运行一个C# 等待任务<>;。完成后进行冷冻,c#,async-await,C#,Async Await,我正在运行一个等待任务。在异步方法中运行(()=>。 等待中的代码将运行到竞争对手,但不会返回。 等待后的下一行永远不会被调用。 有人有什么意见吗 如何调用异步方法 var task1=ConvertToMagickImageAsync(tpFileInfo、fileInfo、density、inputModel.Quality); task1.等待(); 异步方法 受保护的虚拟异步任务转换为GickImageAsync( 元组tpFileInfo ,元组文件信息 ,元组密度 ,内部质量 )
等待任务<>。在异步
方法中运行(()=>
。等待中的代码将运行到竞争对手,但不会返回。
等待后的下一行永远不会被调用。
有人有什么意见吗 如何调用异步方法
var task1=ConvertToMagickImageAsync(tpFileInfo、fileInfo、density、inputModel.Quality);
task1.等待();
异步方法
受保护的虚拟异步任务转换为GickImageAsync(
元组tpFileInfo
,元组文件信息
,元组密度
,内部质量
)
{
字符串错误;
var outputModel=新的XPubMagickImageOutputModel
{
ResultContent=newsorteddictionary()
};
MagickFormat extension=fileInfo.Item3.FileExtension开关
{
“png”=>MagickFormat.png,
“jpg”=>MagickFormat.jpg,
“jpeg”=>MagickFormat.jpeg,
“bmp”=>MagickFormat.bmp,
_=>MagickFormat.Jpg,
};
var magickSettings=new MagickReadSettings();
如果(density.Item1>0)
magickSettings.Density=新密度(Density.Item1);
其他的
magickSettings.Density=新密度(Density.Item2,Density.Item3);
var ret=等待任务。运行(()=>
{
尝试
{
使用(var images=new MagickImageCollection())
{
var-page=0;
image.Read(tpFileInfo.Item1,magickSettings);
////如果(images.Count>0&&images[0].Format==MagickFormat.Pdf)
如果(images.Count>0)
{
var sb=新的StringBuilder(tpFileInfo.Item2);
sb.Append(@“\”).Append(fileInfo.Item1.FileName);
var sb1=新的StringBuilder(tpFileInfo.Item3);
sb1.Append(“.”).Append(扩展名.ToString().ToLower());
foreach(图像中的var图像)
{
图像质量=质量;
image.Format=扩展名;
outputModel.ResultContent[页面]=新的XPubMagickImageNameModel
{
MagickImage=新的MagickImage(图像),
ImageName=$“{sb}{page}{sb1}”
};
page++;
//outputModels.Add(outputModel);
}//end foreach(图像中的var图像)
}//如果(images.Count>0&&images[0].Format==MagickFormat.Pdf)结束
}
error=String.Empty;
outputModel.Result=XPubMagickOperationResultEnum.Success;
}
捕获(例外情况除外)
{
错误=$“异常:{ex.Message}”;
outputModel.Result=XPubMagickOperationResultEnum.ErrorMagickReadFailure;
}
返回输出模型;
});
INTA=1;
//}//结束使用(var images=new MagickImageCollection())
返回ret;
}
您实际上不需要在方法中等待。
只需返回任务并在任务外部等待。Wait()
方法将不再是异步的
protected virtual Task<IXPubMagickImageOutputModel> ConvertToMagickImageAsync(
Tuple<string, string, string> tpFileInfo
, Tuple<IXPubMagickFileModel, IXPubMagickFileModel, IXPubMagickFileModel> fileInfo
, Tuple<double, double, double> density, int quality)
{
string error;
var outputModel = new XPubMagickImageOutputModel
{
ResultContent = new SortedDictionary<int, IXPubMagickImageNameModel>()
};
MagickFormat extension = fileInfo.Item3.FileExtension switch
{
"png" => MagickFormat.Png,
"jpg" => MagickFormat.Jpg,
"jpeg" => MagickFormat.Jpeg,
"bmp" => MagickFormat.Bmp,
_ => MagickFormat.Jpg,
};
var magickSettings = new MagickReadSettings();
if (density.Item1 > 0)
magickSettings.Density = new Density(density.Item1);
else
magickSettings.Density = new Density(density.Item2, density.Item3);
return Task<IXPubMagickImageOutputModel>.Run(() =>
{
try
{
using (var images = new MagickImageCollection())
{
var page = 0;
images.Read(tpFileInfo.Item1, magickSettings);
////if (images.Count > 0 && images[0].Format == MagickFormat.Pdf)
if (images.Count > 0)
{
var sb = new StringBuilder(tpFileInfo.Item2);
sb.Append(@"\").Append(fileInfo.Item1.FileName);
var sb1 = new StringBuilder(tpFileInfo.Item3);
sb1.Append(".").Append(extension.ToString().ToLower());
foreach (var image in images)
{
image.Quality = quality;
image.Format = extension;
outputModel.ResultContent[page] = new XPubMagickImageNameModel
{
MagickImage = new MagickImage(image),
ImageName = $"{sb}_{page}_{sb1}"
};
page++;
//outputModels.Add(outputModel);
}// end foreach (var image in images)
} // end if (images.Count > 0 && images[0].Format == MagickFormat.Pdf)
}
error = String.Empty;
outputModel.Result = XPubMagickOperationResultEnum.Success;
}
catch (Exception ex)
{
error = $"Exception: {ex.Message}";
outputModel.Result = XPubMagickOperationResultEnum.ErrorMagickReadFailure;
}
return outputModel;
});
}
受保护的虚拟任务转换为GickImageAsync(
元组tpFileInfo
,元组文件信息
,元组密度,整数质量)
{
字符串错误;
var outputModel=新的XPubMagickImageOutputModel
{
ResultContent=newsorteddictionary()
};
MagickFormat extension=fileInfo.Item3.FileExtension开关
{
“png”=>MagickFormat.png,
“jpg”=>MagickFormat.jpg,
“jpeg”=>MagickFormat.jpeg,
“bmp”=>MagickFormat.bmp,
_=>MagickFormat.Jpg,
};
var magickSettings=new MagickReadSettings();
如果(density.Item1>0)
magickSettings.Density=新密度(Density.Item1);
其他的
magickSettings.Density=新密度(Density.Item2,Density.Item3);
返回任务。运行(()=>
{
尝试
{
使用(var images=new MagickImageCollection())
{
var-page=0;
image.Read(tpFileInfo.Item1,magickSettings);
////如果(images.Count>0&&images[0].Format==MagickFormat.Pdf)
如果(images.Count>0)
{
var sb=新的StringBuilder(tpFileInfo.Item2);
sb.Append(@“\”).Append(fileInfo.Item1.FileName);
var sb1=新的StringBuilder(tpFileInfo.Item3);
sb1.Append(“.”).Append(扩展名.ToString().ToLower());
foreach(图像中的var图像)
{
图像质量=质量;
image.Format=扩展名;
outputModel.ResultContent[页面]=新的XPubMagickImageNameModel
{
MagickImage=新的MagickImage(图像),
ImageName=$“{sb}{page}{sb1}”
};
page++;
//outputModels.Add(outputModel);
}//end foreach(图像中的var图像)
}//如果(images.Count>0&&images[0].Format==MagickFormat.Pdf)结束
}
error=String.Empty;
outputModel.Result=XPubMagickOperationResultEnum.Success;
}
捕获(例外情况除外)
{
错误=$“异常:{ex.Message}”;
outputModel.Result=XPubMagickOperationResultEnum.ErrorMagickReadFailure;
}
返回输出模型;
});
}
这个问题需要代码格式化,这可能是不需要的。如果只是用来避免死锁(有适当的方法可以避免死锁),这也是一种纯粹的黑客行为。上述问题的公认答案是“异步/等待版本在非默认同步上下文中更容易死锁。”并建议“将其更改为非异步版本,它不会死锁”
protected virtual Task<IXPubMagickImageOutputModel> ConvertToMagickImageAsync(
Tuple<string, string, string> tpFileInfo
, Tuple<IXPubMagickFileModel, IXPubMagickFileModel, IXPubMagickFileModel> fileInfo
, Tuple<double, double, double> density, int quality)
{
string error;
var outputModel = new XPubMagickImageOutputModel
{
ResultContent = new SortedDictionary<int, IXPubMagickImageNameModel>()
};
MagickFormat extension = fileInfo.Item3.FileExtension switch
{
"png" => MagickFormat.Png,
"jpg" => MagickFormat.Jpg,
"jpeg" => MagickFormat.Jpeg,
"bmp" => MagickFormat.Bmp,
_ => MagickFormat.Jpg,
};
var magickSettings = new MagickReadSettings();
if (density.Item1 > 0)
magickSettings.Density = new Density(density.Item1);
else
magickSettings.Density = new Density(density.Item2, density.Item3);
return Task<IXPubMagickImageOutputModel>.Run(() =>
{
try
{
using (var images = new MagickImageCollection())
{
var page = 0;
images.Read(tpFileInfo.Item1, magickSettings);
////if (images.Count > 0 && images[0].Format == MagickFormat.Pdf)
if (images.Count > 0)
{
var sb = new StringBuilder(tpFileInfo.Item2);
sb.Append(@"\").Append(fileInfo.Item1.FileName);
var sb1 = new StringBuilder(tpFileInfo.Item3);
sb1.Append(".").Append(extension.ToString().ToLower());
foreach (var image in images)
{
image.Quality = quality;
image.Format = extension;
outputModel.ResultContent[page] = new XPubMagickImageNameModel
{
MagickImage = new MagickImage(image),
ImageName = $"{sb}_{page}_{sb1}"
};
page++;
//outputModels.Add(outputModel);
}// end foreach (var image in images)
} // end if (images.Count > 0 && images[0].Format == MagickFormat.Pdf)
}
error = String.Empty;
outputModel.Result = XPubMagickOperationResultEnum.Success;
}
catch (Exception ex)
{
error = $"Exception: {ex.Message}";
outputModel.Result = XPubMagickOperationResultEnum.ErrorMagickReadFailure;
}
return outputModel;
});
}