backgroundWorkerで新しいループタスクを起動したい
backgroundWorkerの中で初期化処理した後に定期処理タスクを起動して画面に進行状況を知らせたいです。初期化処理は問題なく処理できましたが、定期処理タスクが正常に起動できなかった、'System.InvalidOperationException'というエラーが出ました。
以下は主なソースです
---コントローラのInvokeを使って解決出来ました、ここを参考しました
メイン画面
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BGThread
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
backgroundWorker1.ReportProgress(0, "start Form init--");
Console.WriteLine("start Form init--");
Thread.Sleep(5000);
LoopWork lw = new LoopWork(backgroundWorker1);
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
string msg = (string)e.UserState;
textBox1.Text = msg;
}
}
}
定期処理タスク
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace BGThread
{
public class LoopWork
{
private BackgroundWorker bgWorker;
public LoopWork(BackgroundWorker bgWorker)
{
this.bgWorker = bgWorker;
init();
}
private void init()
{
task1();
task2();
}
private void task1()
{
Task.Factory.StartNew(() =>
{
while (true)
{
bgWorker.ReportProgress(0, "taks1--" + DateTime.Now.ToString("hh:mm:ss"));
Console.WriteLine("taks1--" + DateTime.Now.ToString("hh:mm:ss"));
Thread.Sleep(new TimeSpan(0, 0, 10));
}
});
}
private void task2()
{
Task.Factory.StartNew(() =>
{
while (true)
{
bgWorker.ReportProgress(0, "taks2--" + DateTime.Now.ToString("hh:mm:ss"));
Console.WriteLine("taks2--" + DateTime.Now.ToString("hh:mm:ss"));
Thread.Sleep(new TimeSpan(0, 0, 15));
}
});
}
}
}