从任务中获取对象并从非异步方法中返回
本文关键字:返回 异步方法 取对象 任务 获取 | 更新日期: 2023-09-27 18:16:52
我有一个较低级别的库,我设计的方法之一是异步的,并返回一个任务。
我知道在低级库中使用异步方法不是一个好主意,但是没有办法解决这个问题,因为处理是多么的复杂。
在我的底层库之间,我有一个主库,它公开了问题中的底层库方法。"就像一个业务层"。
我的应用程序的入口点是一个WEB Api,然后它调用中间层库,中间层调用最低层库。
我的相关问题是,它是更好地解包从最低级别的库,其中异步链开始在我的中间库,然后只是一个静态方法暴露给消费者,或者我应该只是提供消费者一个异步方法,只是提供异步方法从最低到最高?
从进入应用程序的第一个方法是:CutSheet.CutSheet cutSheet = AlumCloudPlans.Manager.GetCutSheet(elev);
我知道肯定有更好的方法,因为在中级库中,我必须创建一个全新的任务,返回值是一个任务,返回任务值
你会建议我在中级库中做什么?
——最低水平namespace CutSheet
{
public class Manager
{
public async static Task<CutSheet> GetCutSheet(IElevation elevation)
{
return new CutSheet(await new PartsProcessor.PartProcessor()
.ProcessParts(elevation));
}
}
}
——中期水平
namespace AlumCloudPlans
{
public class Manager
{
public static CutSheet.CutSheet GetCutSheet(IElevation elevation)
{
var t = Task.Factory.StartNew(async delegate
{
return await CutSheet.Manager.GetCutSheet(elevation);
});
t.Wait();
return t.Result.Result;
}
}
}
—最高级别和应用程序入口
namespace StorefrontSystem.Controllers
{
[Authorize]
public class CutSheetController : AlumCloudWebApiBaseController
{
public async Task<HttpResponseMessage> Get(string a, string f, int id)
{
HttpResponseMessage r = Request.CreateResponse();
IElevation elev = await ElevationManager.GetElevation(id);
CutSheet.CutSheet cutSheet = AlumCloudPlans.Manager
.GetCutSheet(elev);
var ms = new MemoryStream();
bool isPDF = f.ToLower() == "pdf";
if (isPDF)
{
using (var pdf = await cutSheet.GetCutSheetPDF(elev))
{
pdf.Save(ms, false);
}
}
else
{
using (Bitmap canvas = await cutSheet.GetDrawing())
{
canvas.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
}
}
ms.Position = 0;
r.Content = new StreamContent(ms);
if (isPDF)
{
r.Content.Headers.ContentType
= new Headers.MediaTypeHeaderValue("Application/pdf");
}
else
{
r.Content.Headers.ContentType
= new Headers.MediaTypeHeaderValue("image/png");
}
return r;
}
}
}
我知道在低级库中使用异步方法不是一个好主意
谁告诉你的?在任何级别上使用async
方法都是一个非常好的主意,只要您所做的操作是自然异步的。然而,并不是一个好主意,在较低的层次上,通过使用Task.Run
来假装是异步的——这在ASP.NET中尤其正确。
假设您的操作是自然异步的,您应该一直使用async
。
中层:
public class Manager
{
public static Task<CutSheet.CutSheet> GetCutSheetAsync(IElevation elevation)
{
return CutSheet.Manager.GetCutSheetAsync(elevation);
}
}
最高级别的:
[Authorize]
public class CutSheetController : AlumCloudWebApiBaseController
{
public async Task<HttpResponseMessage> Get(string a, string f, int id)
{
HttpResponseMessage r = Request.CreateResponse();
IElevation elev = await ElevationManager.GetElevationAsync(id);
CutSheet.CutSheet cutSheet = await AlumCloudPlans.Manager.GetCutSheetAsync(elev);
...
}
}