Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步和/或在自己的线程上调用方法以提高性能_C#_Multithreading_Azure - Fatal编程技术网

C# 异步和/或在自己的线程上调用方法以提高性能

C# 异步和/或在自己的线程上调用方法以提高性能,c#,multithreading,azure,C#,Multithreading,Azure,我的问题涉及到我使用asp.net/c创建的一个web api,它被部署到Azure服务器上。API基本上会收到一个请求,以处理上面打印了一些文本的图像 我有一个方法,它在收到get请求后被调用。在英语中,该方法执行一些设置,然后从Azure blob存储下载请求的正确图像,然后执行绘图 public HttpResponseMessage process(string image){ DoSomeSetup(); DownloadFromBlob(image); return Dra

我的问题涉及到我使用asp.net/c创建的一个web api,它被部署到Azure服务器上。API基本上会收到一个请求,以处理上面打印了一些文本的图像

我有一个方法,它在收到get请求后被调用。在英语中,该方法执行一些设置,然后从Azure blob存储下载请求的正确图像,然后执行绘图

public HttpResponseMessage process(string image){

DoSomeSetup();  

DownloadFromBlob(image);

return DrawTextOnImage();
}
我的问题是,从Azure blob下载需要所有操作中最长的时间,通常为2-3秒。我想,如果我可以在安装过程中下载图像,以节省时间,效率会更高

public HttpResponseMessage process(string image){

startDownloadingImageFromBlob(image);

DoSomeSetup();

EnsureImageDownloadFinished();

return DrawTextOnImage();
}
我的印象是打电话

Bitmap templateImage = DownloadImageFromUrl(BLOB_STORAGE_TEMPLATES_BASE_URL)

在方法的顶部,将等待下载完成,然后再进入设置。是否有一种方法可以让下载与安装同时进行,然后(如有必要)等待下载完成再绘制?

您可以生成一个并行执行的任务,然后等待任务完成再继续。大概是这样的:

// using System.Threading.Tasks;
public HttpResponseMessage process(string image) {

   var downloadTask = Task.Run(() => {
       DownloadFromBlob(image);
    });

   DoSomeSetup();  

   downloadTask.Wait();

   return DrawTextOnImage();
}

参考:

您可以生成一个并行执行的任务,然后等待任务完成后再继续。大概是这样的:

// using System.Threading.Tasks;
public HttpResponseMessage process(string image) {

   var downloadTask = Task.Run(() => {
       DownloadFromBlob(image);
    });

   DoSomeSetup();  

   downloadTask.Wait();

   return DrawTextOnImage();
}

参考资料:

您应该不要使用
等待
任务。在ASP.NET上运行

由于下载是基于I/O的操作,因此异步方法最有意义。要做的第一件事是确定
DownloadFromBlob
正在调用哪些API,将它们更改为异步等价物,并使用
wait
调用它们。然后允许
async
从那里增长(编译器将指导您)。最终,你会得到如下结果:

async Task<Bitmap> DownloadFromBlobAsync(string image);

您应该不要使用
等待
任务。在ASP.NET上运行

由于下载是基于I/O的操作,因此异步方法最有意义。要做的第一件事是确定
DownloadFromBlob
正在调用哪些API,将它们更改为异步等价物,并使用
wait
调用它们。然后允许
async
从那里增长(编译器将指导您)。最终,你会得到如下结果:

async Task<Bitmap> DownloadFromBlobAsync(string image);

看起来这正是我要找的。我将做一些性能测试,看看这是否如预期的那样工作。如果有,我会报告并接受答案。谢谢但下载是一种IO操作。是否存在不需要另一个线程的异步下载方法?OP可能没有足够的经验,无法通过调用来查看trolling尝试。请在Asp.net中等待任务…^显然没有。。想解释一下吗?我的理解是在ASP.NET应用程序中使用
Task.Run
不是一个好主意…至少不用于I/O绑定操作。换句话说,勒内所说的。看起来这正是我想要的。我将做一些性能测试,看看这是否如预期的那样工作。如果有,我会报告并接受答案。谢谢但下载是一种IO操作。是否存在不需要另一个线程的异步下载方法?OP可能没有足够的经验,无法通过调用来查看trolling尝试。请在Asp.net中等待任务…^显然没有。。想解释一下吗?我的理解是在ASP.NET应用程序中使用
Task.Run
不是一个好主意…至少不用于I/O绑定操作。换言之,Rene所说的。除非
DoSomeSetup()
也是IO限制或特别CPU密集型的,否则通过尝试异步下载,您很可能会看到(难以想象的)性能下降。除非
DoSomeSetup()
也是IO限制或特别CPU密集型的,通过尝试异步下载,您很可能会看到(难以想象的)性能下降。