2013-03-12 85 views
1

我刚刚接受了5分钟的采访。我被给了这个场景,他问我如何在C#1.0或2.0中处理这个问题。他说有一个基本的功能来处理这个问题,我不确定。可有人请帮助:(如何在C#中处理这种异步编程方案

问:

有在WinForm应用程序和一个按钮,两个文本框一个文本框中输入需要的价值和按钮被点击时,处理在服务器输入这需要地狱很多时间和最终结果显示在另一个文本,因为它需要很长的时间在服务器上,用户界面不应该被所中断,你怎么处理这种情况,他问我:(

答案我给了。

我告诉多线程并说异步和等待,他期待在C#2.0瘦身中处理这种简单的方法G。我猜测异步代表。他不相信。请有人解释我几乎没有易懂的代码:)

回答

2

你会在一个单独的线程中运行长时间运行过程中对用户界面,以防止它挂,也许BackgroundWorker将被用于例如: -

bgWorker.RunWorkerAsync([DATA TO PROCESS])//Passing in data to operate on 

private void bgWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
     MyObject obj = (MyObject)sender; 

     // 
     // Do some work with the data on the server 
     // 

     // Report on progess, is it done? 
     bgWorker.ReportProgress(); 
} 

你也可以有一个完整的工作方法

private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
     //Work is complete, notify user 
} 

你也可以使用ThreadPool,这需要更多的设置,但我觉得更灵活。例如: -

ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), [DATA TO PROCESS]); 
Interlocked.Increment(ref workItems); 

工作项是项目数的计数留下来处理,这可以用于跟踪的任务是否完成与否。然后我们定义一个DoWork方法来处理数据并减少我们的工作计数器。一旦项目已被处理,我们通过与会代表汇报工作进度,如: -

private delegate void ThreadDone(MyObject obj); 
    private delegate void TaskDone(); 

    public void DoWork(object sender) 
    { 
     MyObject obj = (MyObject)sender; 

     this.Invoke(new ThreadDone(ReportProgress), result); 
     Interlocked.Decrement(ref workItems); 

     if (workItems == 0) 
     { 
      this.Invoke(new TaskDone(WorkComplete)); 
     } 
    } 

报告进展情况可能是这样的: -

private void ReportProgress(MyObject obj) 
{ 
    if (workItems >= 0) 
    { 
     //Job isn't complete, report progress    
    } 
} 

private void WorkComplete() 
{ 

} 
+0

嗨,DGibbs,非常感谢你帮助我通过,它帮助我很多。我将进一步探讨这一点。欢呼:) – Learner 2013-03-12 13:13:32

+2

Downvoter care to comment? – DGibbs 2013-03-12 17:20:39

0

在.Net 2 winform应用程序中,最简单的解决方案是使用BackgroundWorker。它的事件在UI线程中引发,所以你不需要自己进行任何编组。

通常的模式是这样的:

BackgroundWorker bg = new BackgroundWorker(); 
bg.DoWork += delegate(object sender, DoWorkEventArgs e) { 
    try { 
     e.Result = server.LongRunningOperation(); 
    } 
    catch(Exception ex) { 
     e.Error = ex; 
    } 
}; 

bg.RunWorkerCompleted += delegate(object sender, RunWorkerCompletedEventArgs e) { 
    //update UI 
}; 

bg.RunWorkerAsync(); 
+0

谢谢你这么多利,它可以帮助我,我觉得这是他期待的东西,该死的我没有说这个:(今天我会探索这个概念本身:)再次感谢你:)干杯 – Learner 2013-03-12 13:12:44