WPF / C#取消DoWork之外的BackgroundWorker调用

|| 我有一个
BackgroundWorker
DoWork
函数,如下所示
    private void WorkerGetFeedData(object sender, DoWorkEventArgs args)
    {
            _feed.FetchUserData(_userNameCollection);
    }
FetchUserData
是同一解决方案中另一个项目的另一个类(其对象是is4ѭ)中的函数。数据提取过程需要花费大量时间,我希望用户能够在必要时取消该过程。如何将取消操作从用户传递到其他地方的函数调用,然后将其停止?     
已邀请:
        您可以使用
BackgroundWorker.CancelAsync
方法。这里是示例的更多信息:MSDN 为了更准确地解决您的问题,请将工作人员交给
FetchUserData
。它是发送者参数。然后在
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);
}
    
        向工作线程发送一条消息(事件),该消息会更改一个布尔值,指示工作线程应自行结束/取消。 编辑:我有点想念您的问题,但缺少重要部分。在尝试化妆时,我发现了这篇有趣的文章,可能会有所帮助: 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可以在不影响您进程内部状态的情况下杀死它。     

要回复问题请先登录注册