【问题标题】:Multithreading accepts value and return value多线程接受值和返回值
【发布时间】:2010-12-18 11:14:58
【问题描述】:

大家好,我编写了以下代码来返回 pdf 报告。该代码基于多线程示例代码。你们能提供一些关于它的反馈吗,我是多线程的新手。 非常感谢! 杰弗里

public delegate void StreamResultDelegate(Stream streamResults);

public class GenerateReport
{
    private StreamResultDelegate callback;

    public GenerateReport(StreamResultDelegate _callback)
    {
        callback = _callback;
    }

    public void ThreadProc()
    {
        if (callback != null)
        {
            callback(Testing());
        }
    }

    public Stream Testing()
    {
        var reportsService = new ReportsService();
        var nameValueCollection = new NameValueCollection();
        byte[] pdfReportContents = reportsService.GetReport("/Rocket.Reports/RocketReport", nameValueCollection);
        var stream = new MemoryStream(pdfReportContents);
        return stream;
    }
}

//跟随

    [HandleError]
public class HomeController : Controller
{
    private Stream streamTesting = null;
    public void StreamResultCallBack(Stream s)
    {
        streamTesting = s;
    }

    public FileStreamResult GeneratePdfReport()
    {
        var g = new GenerateReport(_callback: new StreamResultDelegate(StreamResultCallBack));
        var t = new Thread(new ThreadStart(g.ThreadProc));
        t.Start();
        t.Join();

        HttpContext.Response.AddHeader("content-disposition", "attachment; filename=Rockets_List_Printout.pdf");
        return new FileStreamResult(streamTesting, "application/pdf");
    }}

【问题讨论】:

    标签: asp.net asp.net-mvc multithreading reporting-services


    【解决方案1】:

    我建议使用异步控制器 -> MSDN 并停止在控制器方法中使用线程=)

    【讨论】:

    • 我同意使用异步控制器,但在他的情况下它仍然没有用,因为他只做一件事。
    • 嗨 ZippyV,你是对的。这个请求只做一件事就是生成报告。
    • 感谢 Alexey 和 ZippyV,你是对的。因为这个请求只做一件事就是生成报告。那么在这种情况下,我的代码实际上是否提供了任何性能改进?如果没有,在 web 环境中,既然我们有这个服务器客户端请求断开模型,那么多线程有什么帮助呢?非常感谢!
    • 我需要更多关于您的架构的信息来回答这个问题。但是,如果您只是发送单向请求(不带报告的响应)然后稍后检查报告并且您没有使用每次调用调用模型(asp.net mvc 操作或每次调用 wcf),您可能会获得一些性能改进,如果您的报告解决方案能够并行创建报告。
    【解决方案2】:

    我的建议是创建一个私有对象来存储结果。这是最简单的方法

    更新

    public delegate void work_handler(Stream streamResults);
    public class Report
    {
     public object Result = null;
    
     private Thread workThread = new ...;
    
     public void Work(object param)
     {
      this.Result = ....;
      // signal finish. eg. if winapp use someControl.Invoke(signal_Handler);
      // for web app use this.Session["isDone"] = true;
     }
    
     // for .net 4.0
     private object param = null;
     public void Work() 
     {
      // for serial invoking
      var taskOption = System.Threading.Tasks.TaskCreationOptions.LongRunning;
      System.Threading.Tasks.Task task = new System.Threading.Tasks.Task(() => {... }, taskOption);
    
      // for multiple method parallel invoke
      System.Threading.Tasks.Parallel.Invoke(() => { this.Result = genReport(param); }, () => {... }, () => {...});
     }
    }
    

    【讨论】:

    • 谢谢 Bonshington,我能否请您提供更多关于如何实现这一目标的详细信息。干杯
    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2013-11-06
    • 2012-02-27
    相关资源
    最近更新 更多