How to cancel an asynchronous call? 异步调用 的中断 取消 c#

来源:互联网 发布:编程入门书籍 编辑:程序博客网 时间:2024/05/18 02:55

A "cancel flag" is the way to do it, though not a global one, necessarily. The unavoidable point is that you needsome way to signal to the thread that it should stop what it's doing.

In the case of BeginInvoke, this is hard to do with anything but a global flag, because the work is carried out on the threadpool, and you don't know which thread. You have a couple of options (in order of preference):

  1. Use the BackgroundWorker instead of BeginInvoke. This hascancellation functionality baked-in. This has other benefits, like progress monitoring, and "Work complete" callbacks. It also nicely handles exceptions.
  2. Use ThreadPool.QueueUserWorkItem, passing in an object as the state that has aCancel() method that sets aCancelled flag that the executing code can check. Of course you'll need to keep a reference to the state object so you can callCancel() on it (which is something theBackgroundWorker does for you - you have a component on your form. (Thanks toFredrik for reminding about this).
  3. Create your own ThreadStart delegate, passing in a state object as with option 2.  

详见:http://stackoverflow.com/questions/1729346/how-to-cancel-an-asynchronous-call