2010/04/15(Thu) 14:11:22 編集(投稿者)
No48850 (Jem さん) に返信
確認事項へのご返答ありがとうございます。
> ソースは事情により一部伏せ、抜いている部分がありますがご容赦下さい。
例えば、その中の処理で止まっているということはないでしょうか。
Textで実際にFormに描画されるまで
http://bbs.wankuma.com/index.cgi?mode=al2&namber=48812
の関連質問ですよね?
例えば、ReadLineメソッドで止まっていたり・・・ということはないかなと気になります。
提示のコードの「Console.WriteLine(str_abc);」の箇所による
表示は進んでいるのでしょうか?
> 実際のところどこか勘違いしていると思うのですが、怪しいところはどのあたりなのでしょうか。
提示のソースコードの範囲では特に怪しいところはありませんでした。
以下のように検証しました。
(1) 新規プロジェクトを作成 (VS2008、WinXP SP2、Windowsアプリ)
(2) start/cancelとしてButtonを配置
(3) bgWorkerとしてBackgroundWorkerを配置
(4) デザイナでbgWorkerのWorkerSupportsCancellationプロパティをTrueに設定。
(5) 各ボタンのClickイベント、bgWorkerのDoWorkイベント、RunWorkerCompletedイベントと
ハンドラの紐付けもデザイナで行いました。
(6) 検証のため、private変数でstreamを追加。startボタンのClickイベントでMemoryStreamを使って
複数行のテキストに関連付けています。
(7) 2回実行してみて、キャンセルせずに待って"正常に完了"のメッセージ、
キャンセルを実行して"キャンセルされました"のメッセージ、を確認しました。
'-- 記述したコード --
using System;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
// 検証のための追加コード
private Stream stream;
public Form1()
{
InitializeComponent();
}
private void start_Click(object sender, EventArgs e)
{
// 検証のための追加コード
string text = "";
for (int i = 0; i < 10; i++)
{
text += i.ToString("0000") + ":あいう\n";
}
stream = new MemoryStream(Encoding.UTF8.GetBytes(text));
bgWorker.RunWorkerAsync();
}
private void cancel_Click(object sender, EventArgs e)
{
bgWorker.CancelAsync();
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
Console.WriteLine("thread start");
BackgroundWorker worker = (BackgroundWorker)sender;
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
string str_abc = reader.ReadLine().ToString();
Console.WriteLine(str_abc);
System.Threading.Thread.Sleep(500);
}
}
}
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Console.WriteLine("bgWorker_RunWorkerCompleted");
if (e.Cancelled)
{
MessageBox.Show("キャンセルされました");
// この場合にはe.Resultにはアクセスできない
}
else
{
// 処理結果の表示
MessageBox.Show("正常に完了");
}
}
}
}