簡體   English   中英

我應該使用Backround工作者還是編寫自己的線程

[英]Should I use a Backround worker or write my own threads

因此,我們有一個程序在主界面中具有暫停按鈕。 當按下暫停按鈕時,將保存一個時間戳,然后再次創建另一個時間戳,將計算兩者之間的時間差,然后使用WebClient將所有3個值和用戶名一起發送到db。 問題是,如果快速多次按下按鈕,則發送所有數據都會出現問題。

我有一個創建隊列的想法,而不是發送數據的暫停按鈕,而是將其寫入隊列,然后讓一個單獨的線程檢查隊列並處理發送的句柄。

使用計時器每隔x秒觸發后台工作人員一項簡單的任務,即讀取隊列並發送數據(如果感覺過分/濫用)。 我是對的,這更多是常規線程的工作,還是后台工作者要走的路?

我將使用包裝在BlockingCollection類中的ConcurrentQueue,並使用Task來監視集合。

var pendingEntries = new BlockingCollection<List<Entry>>(new ConcurrentQueue<List<Entry>>());
var loggingTask = System.Threading.Tasks.Task.Factory.StartNew(ConsumerTask, pendingEntries);

Entry類是您想要一次記錄的任何內容的容器。

使用者任務如下所示:

private void ConsumerTask(object parameter) 
{
    var localPendingEntries = (BlockingCollection<List<Entry>>)parameter;
    foreach (var entry in localPendingEntries.GetConsumingEnumerable())
    {
       // push the 'entry' where you want.
    }
}

要將條目添加到隊列,請執行以下操作:

var newEntry = new Entry(......);
pendingEntries.Add(newEntry);

完成添加條目后,請調用此命令:

pendingEntries.CompleteAdding();

一旦完成處理當前隊列中的條目,該任務將脫離foreach循環。

然后,您可以等待任務完成:

loggingTask.Wait();
pendingEntries.Dispose();

我個人使用線程。 后台工作人員為我占用了太多代碼。 如果將線程作為全局變量,則可以隨意終止或啟動線程。

在這里看看: BackgroundWorker vs background Thread

對於線程和后台工作人員,您都可以查看它們是否正在運行。 如果它們正在運行,則可以禁用該按鈕(如果正在運行)或啟用它,以便該按鈕不執行任何操作。 對於您正在執行的操作,我建議背景工作者。

protected void btnPause_Click(object sender, EventArgs e)
    {
        System.ComponentModel.BackgroundWorker disableWorker = new System.ComponentModel.BackgroundWorker();
        disableWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(disableWorker_DoWork);
        disableWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(disableWorker_RunWorkerCompleted);
        disableWorker.RunWorkerAsync();
    }

    void disableWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
    {
        btnPause.Enabled = true;
    }

    void disableWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        btnPause.Enabled = false;
        System.Threading.Thread.Sleep(10000);            
    }

暫無
暫無

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

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