我有BackgroundWorker
DoWork
函数,如下所示
private void WorkerGetFeedData(object sender, DoWorkEventArgs args)
{
_feed.FetchUserData(_userNameCollection);
}
FetchUserData
是同一解决方案中另一个项目中另一个类(其对象为_feed
)的函数。数据获取过程需要相当长的时间,并且我希望用户能够在必要时取消该过程。如何将取消操作从用户传达到其他地方的函数调用并停止它?
答案 0 :(得分:4)
您可以使用BackgroundWorker.CancelAsync
方法。以下是有关示例的更多信息:MSDN
为了更准确地解决您的问题,请将工作人员传递给FetchUserData
。它是sender参数。然后在FetchUserData
函数中,您可以检查是否已设置标记BackgroundWorker.CancellationPending
并完成您的方法。
void FetchUserData(IEnumerable<Users> userNameCollection, BackgroundWorker worker)
{
// ...
if(worker.CancellationPending)
{
// Finish method..
}
}
和WorkerGetFeedData方法:
private void WorkerGetFeedData(object sender, DoWorkEventArgs args)
{
var worker = sender as BackgroundWorker;
if(worker != null)
_feed.FetchUserData(_userNameCollection, worker);
}
答案 1 :(得分:0)
向更改布尔值的工作线程发送消息(事件),指示工作线程应该自行结束/取消。
编辑:我有点快速阅读您的问题,错过了重要部分。在尝试弥补的同时,我发现这篇有趣的文章可能有所帮助:
http://ondotnet.com/pub/a/dotnet/2003/02/18/threadabort.html
当使用Thread.Sleep()模拟一个长时间运行的进程时,它确实有效,正在工作我现在没有时间编写代码来在适当的应用程序/长时间运行的任务上测试它。
class Program
{
static void Main(string[] args)
{
Thread thread = new Thread(new ThreadStart(Foo));
thread.Start();
Console.ReadKey();
thread.Abort(); // cause ThreadAbortException to be thrown
Console.ReadKey();
}
static void Foo()
{
try
{
while( true )
{
Console.WriteLine("Long running process...");
Thread.Sleep(100000);
}
}
catch( ThreadAbortException ex )
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("Thread Closing ...");
}
}
}
这种方法的问题是 - 它使用Thread.Abort() - 无论它在做什么都会中断线程。这可能会导致左侧打开手柄,内存泄漏等。因此,虽然它可能有所帮助,但使用它很可能是非常不明智的。
Ian Griffiths假设另一种(强制)取消线程的方法是在它自己的单独进程中运行它:http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation你可以在不影响进程内部状态的情况下终止它。