2010-12-18 4 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

+0

보고서를 생성하는 동안 그는 적어도 스레드를 차단하지 않을 것입니다.) –

+0

안녕 ZippyV, 당신이 바로 이것에 관한 것입니다.이 요청은 보고서를 생성하는 한 가지 일뿐입니다. – jeffreychi

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

관련 문제