我有两个函数ChangeText()& ChangeColor(),第一个函数名为ChangeText谁将加载大量的数据到内存中,这将花费大量的时间,所以我运行它异步;另一个叫做ChangeColor,当数据加载好时,它会改变按钮的颜色,所以有一个命令来运行这两个函数:第一个是ChangeText,第二个是ChangeColor。这里是我的代码:为什么EventWaitHandle不起作用?
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的:
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);
}
}
}
我拟用的EventWaitHandle同步这两个功能,但结果是,这两个函数将仍处于运行混乱顺序:有时会首先使用ChangeText()函数,有时会首先使用ChangeColor()。我只是很困惑。
还有,我使用线程池来启动这两项功能,但为什么我得到了相同的线程ID象下面这样:!
装载终了(Thread.CurrentThreadName = 10)着色面漆(Thread.CurrentThreadName = 10)
我以为Thread.CurrentThreadName会因为我使用线程池而不同!为什么? thx为您的答案。
嗨grzegorz_p,其实这是一个示例,但在实际工作中,ChangeColor函数将挑选出大量数据并与旧的txt文件进行比较,然后将数据着色为与旧数据相同。所以在这里我只是单独运行该功能。 thx为您的回复:) – CharlieShi 2012-01-05 09:05:34
我已经做了一点调查,似乎我们有罪:) – 2012-01-05 10:02:30
我不知道你的意思。我认为我们应该使用ThreadPool.QueueUserWorkItem(o => ChangeText()); ThreadPool.QueueUserWorkItem(o => ChangeColor());代替。 – CharlieShi 2012-01-05 14:08:34