簡體   English   中英

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

[英]WPF/C# Cancelling BackgroundWorker call outside DoWork

我有一個BackgroundWorker DoWork函數,如下所示

    private void WorkerGetFeedData(object sender, DoWorkEventArgs args)
    {
            _feed.FetchUserData(_userNameCollection);
    }

FetchUserData是同一解決方案中另一個項目中另一個類(其對象是_feed )中的一個函數。 數據提取過程需要花費大量時間,我希望用戶能夠在必要時取消該過程。 如何將取消操作從用戶傳遞到其他地方的函數調用,然后將其停止?

您可以使用BackgroundWorker.CancelAsync方法。 這里是示例的更多信息: MSDN

為了更精確地解決您的問題,請將工作FetchUserData傳遞給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可以在不影響進程內部狀態的情況下殺死它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM