|
分類:[C#]
はじめましてバックグランドワーカ、C#初心者です。よろしくお願い致します。
環境はVS2013 C# WindowsFormアプリケーションです。
メインフォームとBGWスレッドの間でデータ受け渡しが多いため、
グローバル変数でやり取りすることを考えており、BGW使い方を含めて基礎動作の確認を行っております。
メイン側でグローバル変数、変数1、変数2を定義し、
メインフォームのタイマーで変数1を加算しています。
BGWスレッドで変数1の値を比較し変数2の計算を行っているのですが
計算結果が期待した値になりません。
実際はこのような処理ではないですが、現象再現のため簡略化したプログラムが下記になります。
実際はもっと多くのデータやり取りですが、基本的には変数操作はBGW側で行い、
メイン側はほとんどが表示や参照だけであるため排他制御の必要もないと考えております。
基本的な問題かと思いますが御教授願います
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
long Cnt1 = 0; // 変数1
long Cnt2 = 1; // 変数2
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
Cnt1++; // メインフォームのタイマーで変数1を加算
}
private void btnBGWSta_Click(object sender, EventArgs e)
{
bgW1.RunWorkerAsync();
}
private void btnBGWStp_Click(object sender, EventArgs e)
{
bgW1.CancelAsync();
}
//=================================================================================
// BGW Main
//=================================================================================
private void bgW1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
if (bgW1.CancellationPending)
{
e.Cancel = true;
break;
}
if (Cnt1 == 100) // 変数1の値を比較
{
Cnt2 = Cnt2 * 2; // 変数2を計算 初期値1であるため結果2を期待しているが2048になる
}
System.Threading.Thread.Sleep(1);
}
}
}
}
|