【发布时间】:2020-08-31 20:57:28
【问题描述】:
我对以下代码有疑问。在 Debug 它运行到 }); return true 之后的部分,但从不返回调用方法。以下方法应连接到斑马打印机,发送 ZLP 代码打印并检查状态以确保打印成功。然后返回 true 或 false(之后将添加异常处理),如果为 true,则将打印的值提交到数据库。
private Boolean printLabel(string productName, double productWeight, String customerLabelType, String scaleNumber, String packageDate, String lotNumber, String barCode)
{
string s = dao.getCustomerLabel(customerLabelType);
s = s.Replace("<<<product_weight>>>", productWeight.ToString());
s = s.Replace("<<<product type>>>>", productName);
s = s.Replace("<<<barcode>>>", barCode);
s = s.Replace("<<<Packed Date:>>>", packageDate);
s = s.Replace("<<<Lot Number:>>>", lotNumber);
// RawPrinterHelper.SendStringToPrinter("ZDesigner GX420d", s);
string ipAddress = dao.getPrinterIp(scaleNumber);
try
{
return PrintOneLabelTask(ipAddress, s).Result;
}
catch (Exception ex)
{
}
return false;
}
private async Task<Boolean> PrintOneLabelTask(string theIpAddress, String ZPL_STRING)
{
await Task.Run(() =>
{
// Instantiate connection for ZPL TCP port at given address
Connection thePrinterConn = new TcpConnection(theIpAddress, TcpConnection.DEFAULT_ZPL_TCP_PORT);
ZebraPrinter printer = PrintHelper.Connect(thePrinterConn, PrinterLanguage.ZPL);
PrintHelper.SetPageLanguage(printer);
if (PrintHelper.CheckStatus(printer))
{
PrintHelper.Print(printer, ZPL_STRING);
if (PrintHelper.CheckStatusAfter(printer))
{
Console.WriteLine($"Label Printed");
}
}
printer = PrintHelper.Disconnect(printer);
Console.WriteLine("Done Printing");
return true;
});
return false;
}
【问题讨论】:
-
在
PrintOneLabelTask中使用await Task.Run(()的确切目的是什么?您正在使用 async-over-sync 来冻结.Result;的线程。您可以删除该 Task.Run (以这种方式安排 I/O 工作无用)或一直异步(并使printLabel也异步,及其调用者)。此外,您描述的情况称为 deadlock -
.Result可能出现死锁。 -
是的,感谢我在修改代码后添加了
return Task.Run(async () => await PrintOneLabelTask(ipAddress, s)).Result;并将 PrintOneLabelTask 修改为异步并删除了等待
标签: c# asynchronous async-await task