2010-12-18 45 views
1

嗨,大家好,我写了下面的代码来返回pdf报告。该代码基于多线程示例代码。你们能提供一些关于它的反馈,我是新来的多线程。 非常appriciate! 杰弗里多线程接受值和返回值

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"); 
    }} 

回答

2

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

+1

但在他的情况下,它仍然是无用的,因为他只是在做1两件事。 – ZippyV 2010-12-18 12:59:37

+0

至少他不会阻止线程,而生成报告=) – 2010-12-18 13:32:31

+0

嗨ZippyV,你是对的this.This请求只有一件事是产生报告。 – jeffreychi 2010-12-19 04:14:24

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); },() => {... },() => {...}); 
} 
} 
+0

谢谢Bonshington,我可以请你提供一些关于如何实现这一点的更多细节。干杯 – jeffreychi 2010-12-19 04:10:15