У меня есть две функции с именем ChangeText () и ChangeColor (), первая функция с именем ChangeText, которая будет загружать большое количество данных в память, это будет стоить много времени, поэтому я запускаю ее асинхронно; другая называется ChangeColor, которая изменит цвет кнопки при нормальной загрузке данных, поэтому существует порядок запуска этих двух функций: сначала ChangeText, а затем ChangeColor. вот мой код:
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 (). Я просто так растерялся.
Кроме того, я использую ThreadPool для запуска этих двух функций, но почему я получил такой же ThreadID, как показано ниже:
Загрузка завершена! (Thread.CurrentThreadName = 10) Завершение раскраски! (Thread.CurrentThreadName = 10)
Я думал, что Thread.CurrentThreadName будет другим, потому что я использую пул потоков !!! Зачем? спасибо за ваш ответ.