1

我製作了一個小型的winform應用程序,其中每10分鐘應用程序就會截取桌面並使用web服務以base64解碼格式發送它。在特定的時間間隔後執行任務的正確方法

我使用了一個定時器控件,每10分鐘觸發一次,並使用後臺工作人員更新UI上最後發送的屏幕截圖時間。

問題是,一段時間後,應用程序變得越來越嚴重,我做了一些Google搜索,發現Task Parallel Library是長時間運行流程的正確方法。但我不太瞭解TPL。

可以請指導我如何在我的應用程序中實現TPL 請說出正確和有效的方法。

代碼是

void timer1_Tick(object sender, EventArgs e) 
{ 
    timer1.Interval = 600000 ; //10mins 
    backgroundWorker1.RunWorkerAsync(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new MethodInvoker(delegate { screenShotFunction(); })); 
    } 
    else 
    { 
     screenShotFunction(); 
    } 
} 

private void screenShotFunction() 
{ 

    printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
    Graphics graphics = Graphics.FromImage(printscreen as Image); 
    graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size); 

    mainSendFunction(); 

} 

private void mainSendFunction() 
{ 

    try 
    { 
     //code for webservice and base64 decoding 
    } 
    catch (Exception) 
    { 

    } 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 

} 
+4

這是一個病毒/惡意軟件你寫?或「生產力監控」應用程序? ;-) –

+1

「生產力監測」,通過一切手段...現在...返回工作! – Noctis

+0

您確定沒有異常,例如OutOfMemory或達到的系統資源限制嗎? – Pragmateek

回答

0

我不是TPL專家,但本應該做的:

首先創建來處理你的任務的方法。

private async void ScreenShotTask() 
{ 
    try 
    { 
     while (true) 
     { 
      _cancelToken.ThrowIfCancellationRequested(); 
      screenShotFunction(); 
      await Task.Delay(new TimeSpan(0, 0, 10, 0), _cancelToken); 
     } 
    } 
    catch (TaskCanceledException) 
    { 
     // what should happen when the task is canceled 
    } 
} 

我用await Task.Delay代替Thread.Sleep,因爲它可以被取消。

這是你如何實際啓動任務:

private CancellationTokenSource _cancelSource; 
private CancellationToken _cancelToken; // ScreenShotTask must have access to this 
private void mainMethod() 
{ 
    _cancelSource= new CancellationTokenSource(); 
    _cancelToken = cancelSource.Token; 
    Task.Factory.StartNew(ScreenShotTask, _cancelToken, TaskCreationOptions.LongRunning, TaskScheduler.Default); 
} 

這是怎麼取消任務:

_cancelSource.Cancel(); 
+0

你爲什麼使用'async void'?他們幾乎總是一個壞主意(除非你必須使用它)。 – svick

相關問題