首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这段代码可以通过使用多线程来改进吗?

这段代码可以通过使用多线程来改进吗?
EN

Stack Overflow用户
提问于 2011-10-22 19:21:26
回答 3查看 230关注 0票数 1

我有一个简单的Windows服务,每天只运行一次。它在数据库中执行一些查询,生成适当的html内容(表,div,...)并将其以电子邮件正文的形式发送给多个收件人。

电子邮件的正文是这样创建的:

代码语言:javascript
复制
private static string GenerateBody()
{
    using (var stringWriter = new StringWriter())
    using (var htmlWriter = new HtmlTextWriter(stringWriter))
    {
        htmlWriter.RenderBeginTag("html");
        htmlWriter.RenderBeginTag(HtmlTextWriterTag.Head);
        htmlWriter.WriteLine("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
        htmlWriter.RenderEndTag();
        htmlWriter.RenderBeginTag("body");

        htmlWriter.Write(
            new StringBuilder()
                .Append(OverviewParagraph.GenerateHTMLContent())
                .Append(PackageWeightParagraph.GenerateHTMLContent())
                .Append(BoxWeightParagraph.GenerateHTMLContent())
                .Append(CodeQualityParagraph.GenerateHTMLContent())
                .Append(ChecksParagraph.GenerateHTMLContent())
                .ToString()
        );

        htmlWriter.RenderEndTag();
        htmlWriter.RenderEndTag();

        return stringWriter.ToString();
    }
}

所有的GenerateHTMLContent方法几乎都是一样的--它们在我的数据库中执行查询,在HTMLTextWriter的帮助下构建一个HTML表,然后以字符串的形式返回表。

使用多线程或者异步等待模式可以改进这段代码吗?所讨论的代码是我将行附加到StringBuilder对象的位置。

编辑:我问这个问题是因为我以前从来没有使用过多线程,只是想知道这是否可能。此外,程序现在运行得足够快了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-22 19:40:24

代码语言:javascript
复制
StringBuilder sb = new StringBuilder();
Parallel.Invoke(
    () => { var s = OverviewParagraph.GenerateHTMLContent(); lock (sb) sb.Append(s); },
    () => { var s = PackageWeightParagraph.GenerateHTMLContent(); lock (sb) sb.Append(s); },
    () => { var s = BoxWeightParagraph.GenerateHTMLContent(); lock (sb) sb.Append(s); },
    () => { var s = CodeQualityParagraph.GenerateHTMLContent(); lock (sb) sb.Append(s); },
    () => { var s = CodeQualityParagraph.GenerateHTMLContent(); lock (sb) sb.Append(s); }
);
票数 0
EN

Stack Overflow用户

发布于 2011-10-22 19:39:58

如果它只生成一件事,那么并行化就很复杂,因为您需要考虑同步。当您可以执行任务并行化(独立和隔离的操作并行完成)时,并行化是一个更明显的候选。你也没有提供足够的信息来证明是否需要复杂的工作:

  • 现在需要多长时间?
  • 花多长时间有问题吗?

如果有显着的好处(来证明显着的努力是合理的),那么肯定的!然而,我强烈怀疑,答案是“不”,在这种情况下,不要去管它。在一个操作中处理多个线程是很复杂的。

您也许可以将单独的文档部分视为并行任务,但HTML生成通常相当快-因此,除非您已经对此进行了分析并知道它们需要时间,否则请不要费心。更有可能的是:您的数据查询是阻塞。在这种情况下,花一些时间来改进它,而不用担心并行化。

票数 2
EN

Stack Overflow用户

发布于 2011-10-22 19:43:40

如果GenerateHTMLContent方法是独立的(即,如果并发运行,它们不会相互干扰),您可以一起启动它们,并在它们可用时收集结果:

代码语言:javascript
复制
// start tasks
Task<string> overviewParagraph =
    Task.Factory.StartNew( () => OverviewParagraph.GenerateHTMLContent() );

Task<string> packageWeightParagraph =
    Task.Factory.StartNew( () => PackageWeightParagraph.GenerateHTMLContent() );

....

// collect results
string overviewParagraphHtml = overviewParagraph.Result;
string packageWeightParagraphHtml = packageWeightParagraph.Result;
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7859133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档