ChangeText()&という名前の2つの関数ChangeColor()は、最初にChangeTextという関数を呼び出すことで、大量のデータをメモリにロードしますが、時間がかかるため、非同期に実行します。もう1つはChangeColorと呼ばれ、データのロード時にボタンの色が変わるため、ChangeTextとChangeColorの2つの関数を実行する順序があります。これら二つの機能はまだで実行しているだろうことを、私はこの2つの関数を同期するためにEventWaitHandleを使用する予定EventWaitHandleはなぜ機能しませんか?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ThreadSynchorous
{
public class AsyncInvoke
{
public void BeginAsync(Func<bool> MyFunction)
{
Func<bool> func = new Func<bool>(MyFunction);
IAsyncResult iar = func.BeginInvoke(new AsyncCallback(EndAsync), func);
}
public void EndAsync(IAsyncResult iar)
{
Func<bool> func = (Func<bool>)iar.AsyncState;
func.EndInvoke(iar);
}
}
}
が、結果は次のとおりです。ここ
using System;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Threading;
using System.IO;
namespace ThreadSynchorous
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
asyncInvoke = new AsyncInvoke();
}
AsyncInvoke asyncInvoke;
EventWaitHandle waitMeHandle = new EventWaitHandle(false,EventResetMode.ManualReset);
private void button1_Click(object sender, RoutedEventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
{
asyncInvoke.BeginAsync(ChangeText);
}), null);
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
{
asyncInvoke.BeginAsync(ChangeColor);
}), null);
label1.Content += " \r\n-------------------------\r\n";
}
private bool ChangeText()
{
waitMeHandle.Reset();
this.button1.Dispatcher.Invoke(new Func<bool>(delegate()
{
string filename = @"C:\EXO.txt";
using (StreamReader sr = new StreamReader(filename, Encoding.Default))
{
string result;
while ((result = sr.ReadLine()) != null)
{
//here perform action
}
}
label1.Dispatcher.Invoke(new Func<bool>(delegate
{
label1.Content += "Loading finish!(Thread.CurrentThreadName="+Thread.CurrentThread.ManagedThreadId.ToString()+") ";
waitMeHandle.Set();
return true;
}));
waitMeHandle.Set();
return true;
}));
waitMeHandle.Set();
return true;
}
private bool ChangeColor()
{
waitMeHandle.WaitOne();
this.button1.Dispatcher.Invoke(new Func<bool>(delegate()
{
this.button1.Background = Brushes.Red;
label1.Dispatcher.Invoke(new Func<bool>(delegate()
{
label1.Content += "Coloring finish!(Thread.CurrentThreadName="+Thread.CurrentThread.ManagedThreadId+") ";
return true;
}));
return true;
}));
return true;
}
}
}
AsyncInvokeのクラスがされています。ここに私のコードです混乱の順序:ChangeText()関数を先に使うこともあります。時にはChangeColor()を先に使うこともあります。私はちょっと混乱している。
そしてまた、私はこの二つの機能を起動するためのThreadPoolを使用しますが、なぜ私は以下のように同じスレッドIDました!:
ロード仕上げ(Thread.CurrentThreadName = 10)着色仕上げを(Thread.CurrentThreadName = 10)
スレッドプールを使用しているため、Thread.CurrentThreadNameが異なると私は考えました。どうして?あなたの答えのためのthx。
こんにちはgrzegorz_p、実際これはサンプルですが、ChangeColor関数は多くのデータを取り出して古いtxtファイルと比較し、古いものと同じデータを表示します。だからここで私はちょうど別々に機能を実行する。あなたの返信のためのthx :) – CharlieShi
私は少し調査をしたし、我々は有罪を持っているようだ:) –
私はあなたが何を意味するか正確には分かりません。私はThreadPool.QueueUserWorkItem(o => ChangeText())を使うべきだと思います。 ThreadPool.QueueUserWorkItem(o => ChangeColor());代わりに。 – CharlieShi