相关疑难解决方法(0)

isync/await是否适合IO和CPU绑定的方法?

MSDN文档看起来指出asyncawait适合于IO密集型任务,而Task.Run应该用于CPU密集型任务.

我正在处理一个执行HTTP请求以检索HTML文档的应用程序,然后解析它.我有一个看起来像这样的方法:

public async Task<HtmlDocument> LoadPage(Uri address)
{
    using (var httpResponse = await new HttpClient().GetAsync(address)) //IO-bound
    using (var responseContent = httpResponse.Content)
    using (var contentStream = await responseContent.ReadAsStreamAsync())
        return await Task.Run(() => LoadHtmlDocument(contentStream)); //CPU-bound
}
Run Code Online (Sandbox Code Playgroud)

这是好的和适当的使用asyncawait,或者我是否过度使用它?

c# asynchronous async-await c#-5.0

40
推荐指数
3
解决办法
1万
查看次数

在控制台应用程序中的不同线程中运行任务

我对此做了很多研究,但我似乎仍然无法做到这一点.我必须生成一个包含1000页的pdf文件(我使用一个库),需要为不同的数据执行N次.数据是相互独立的,我可以完全并行生成这个,这正是我想要做的.理想情况下,我希望在10个线程中完成此操作,每个线程在内存中生成pdf并在结束时保存它.假设每个pdf需要15分钟(1000页),如果按顺序执行此操作,那么对于10个pdf文件将是150分钟,如果我使用10个线程则为30分钟.我知道人们不太喜欢穿线,但我怎么能加速呢?

我在看,ThreadPool但后来我Task在4.0中看到了这个新功能.我读到如果我使用的话,我可以强制每个任务在一个单独的线程中运行,TaskCreationOptions.LongRunning但这对我来说似乎不起作用.我也尝试使用ThreadPool但是因为每个PDF都是从url生成的,并且由于某种原因,WebRequest.Create(url)从线程池调用时该方法似乎不会执行?但我想我宁愿让新的Task库工作.

这就是我现在所拥有的,但它似乎仍然按顺序执行.

Task myTask= Task.Factory.StartNew(() =>
                {
                  //code for the task.
                  //get html content
                  //generate pdf file.
                }
                }, new CancellationToken(false), TaskCreationOptions.LongRunning, TaskScheduler.Default);

myTask.Wait();
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?如果您有任何建议,请让我知道.我目前无法超越.net 4.0.

c# multithreading asynchronous

1
推荐指数
1
解决办法
1万
查看次数

标签 统计

asynchronous ×2

c# ×2

async-await ×1

c#-5.0 ×1

multithreading ×1