и открываем файл. FileStream fs
using System; using System.IO; namespace EndOperation { class Class1 { [STAThread] static void Main(string[] args) { //Создаем поток и открываем файл. FileStream fs = new FileStream("text.txt", FileMode.Open); byte[] fileBytes = new byte[fs.Length]; // Запуск метода Read в параллельном потоке. IAsyncResult ar = fs.BeginRead(fileBytes, 0, fileBytes.Length, null, null); for(int i = 0; i<10000000; i++) { // Имитация длительной работы основного // потока, не зависящая от выполнения асинхронного метода. } // После завершения работы основного потока // запускаем завершение выполнения параллельного // метода Read. fs.EndRead(ar); Console.Write(System.Text.Encoding.Default.GetString(fileBytes)); } } } |
Листинг 7.1. |
Закрыть окно |
using System; using System.IO; namespace Pooling { class Class1 { [STAThread] static void Main(string[] args) { FileStream fs = new FileStream("text.txt", FileMode.Open); byte[] fileBytes = new byte[fs.Length]; Console.Write("Выполнение метода Read асинхронно."); // Запуск метода Read асинхронно. IAsyncResult ar = fs.BeginRead(fileBytes, 0, fileBytes.Length, null, null); // Проверка на выполнение асинхронного метода. while(!ar.IsCompleted) { // Во время чтения файла на экран выводится надпись Console.Write("Процесс идет"); } Console.WriteLine(); string textFromFile = System.Text.Encoding.Default.GetString(fileBytes); Console.Write(textFromFile); } } } |
Листинг 7.2. |
Закрыть окно |
using System; using System.IO; namespace Callback { class Class1 { // Создаем поток и массив байтов. static FileStream fs; static byte[] fileBytes; [STAThread] static void Main(string[] args) { // Открываем файл в поток. fs = new FileStream("text.txt", FileMode.Open); fileBytes = new byte[fs.Length]; // Запускаем метод Read асинхронно с передачей в качестве Сallback // метода WorkComplete fs.BeginRead(fileBytes, 0, (int)fs.Length, new AsyncCallback(WorkComplete), null); } /// <summary> /// Метод, вызываемый автоматически при завершении работы параллельного потока. /// </summary> /// <param name="ar">Объект типа IAsyncResult.</param> static void WorkComplete(IAsyncResult ar) { // Запуск окончания метода. fs.EndRead(ar); string textFromFile = System.Text.Encoding.Default.GetString(fileBytes); Console.Write(textFromFile); } } } |
Листинг 7.3. |
Закрыть окно |
// Делегат, принимающий две переменные типа int и возвращающий одну переменную типа int, // для асинхронного запуска метода (Summ) private delegate int AsyncSumm(int a, int b); |
Листинг 7.4. |
Закрыть окно |
private void btnRun_Click(object sender, System.EventArgs e) { int a, b; try { // Преобразование типов данных. a = Int32.Parse(txbA.Text); b = Int32.Parse(txbB.Text); } catch(Exception) { MessageBox.Show(" При выполнении преобразования типов возникла ошибка"); txbA.Text = txbB.Text = ""; return; } AsyncSumm summdelegate = new AsyncSumm(Summ); AsyncCallback cb = new AsyncCallback(CallBackMethod); summ.BeginInvoke(a, b, cb, summ); } |
Листинг 7.5. |
Закрыть окно |
private void CallBackMethod(IAsyncResult ar) { AsyncSumm summdelegate = (AsyncSumm)ar.AsyncState; lblResult.Text = String.Format(" Сумма введенных чисел равна {0}", summdelegate.EndInvoke(ar)); } |
Листинг 7.6. |
Закрыть окно |
private void btnEnd_Click(object sender, System.EventArgs e) { AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod); // Запускаем асинхронно метод AsynchronousMethod. IAsyncResult ar = asyncDeleg.BeginInvoke(ActivateType.End, null, null); // Получаем результаты асинхронного метода. lblEnd.Text = asyncDeleg.EndInvoke(ar); } |
Листинг 7.7. |
Закрыть окно |
private void btnIsComplete_Click(object sender, System.EventArgs e) { AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod); // Запускаем асинхронно метод AsynchronousMethod. IAsyncResult ar = asyncDeleg.BeginInvoke(ActivateType.IsComplete, null, null); while(!ar.IsCompleted) { lblIsComplete.Text = "Ожидание"; } // Получаем результаты асинхронного метода. lblIsComplete.Text = asyncDeleg.EndInvoke(ar); } |
Листинг 7.8. |
Закрыть окно |
private void btnCallback_Click(object sender, System.EventArgs e) { AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod); // Создаем экземпляр callback делегата Callback. AsyncCallback callback = new AsyncCallback(CallbackMethod); // Запускаем асинхронно метод AsynchronousMethod. asyncDeleg.BeginInvoke(ActivateType.Callback, callback, asyncDeleg); } |
Листинг 7.9. |
Закрыть окно |
private void CallbackMethod(IAsyncResult ar) { // Приводим к типу AsynchronousMethodDelegate AsynchronousMethodDelegate asyncDeleg = (AsynchronousMethodDelegate)ar.AsyncState; // Получаем результаты асинхронного метода. lblCallback.Text = asyncDeleg.EndInvoke(ar); } |
Листинг 7.10. |
Закрыть окно |
private void btnAddSync_Click(object sender, System.EventArgs e) { // Синхронный запуск метода UpdateUI UpdateUI(); } // Делегат для вызова метода UpdateUI асинхронно. delegate void AddItemAsyncDelegate(); private void btnAddAsyncMI_Click(object sender, System.EventArgs e) { // Асинхронный вызов метода UpdateAsync AddItemAsyncDelegate asyncDel = new AddItemAsyncDelegate(UpdateAsync); asyncDel.BeginInvoke(null, null); } private void UpdateAsync() { // Асинхронный вызов метода UpdateUI MethodInvoker methodinvoker = new MethodInvoker(UpdateUI); this.BeginInvoke(methodinvoker); } private void UpdateUI() { // Добавление элемента управления. Button btn = new Button(); btn.Text = "Кнопка"; this.Controls.Add(btn); } private void btnAsync_Click(object sender, System.EventArgs e) { // Асинхронный вызов метода UpdateUI // При выполнении этого метода элемент управления на форму // не добавится, поскольку он создан не в основном потоке. AddItemAsyncDelegate asyncDel = new AddItemAsyncDelegate(UpdateUI); asyncDel.BeginInvoke(null, null); } |
Листинг 7.11. |
Закрыть окно |
using System; using System.Runtime.Remoting.Contexts; namespace AutomaticSynchronization { [Synchronization()] class MyClass:ContextBoundObject { string myName; /// <summary> /// Конструктор /// </summary> /// <param name="name">Имя.</param> public MyClass(string name) { this.myName = name; } /// <summary> /// Параллельные потоки НЕ могут /// одновременно использовать свойство Name /// </summary> public string Name { get { return myName;} set { myName = value;} } static int myAge; /// <summary> /// Статический конструктор. /// </summary> static MyClass() { myAge = 15; } /// <summary> /// Возраст. Статическое свойство. Параллельные потоки могут /// одновременно использовать это свойство. /// </summary> public static int Age { get{ return myAge;} set{ myAge = value;} } } } |
Листинг 7.12. |
Закрыть окно |
using System; using System.Threading; using System.Runtime.CompilerServices; namespace Sample { /// <summary> /// Применение атрибута MethodImplAttribute /// </summary> public class SomeClass { /// <summary> /// Статическая переменная. /// </summary> static int staticValue = 0; /// <summary> /// Переменная экземпляра. /// </summary> int instanceValue = 0; /// <summary> /// Синхронизированный доступ к переменной экземпляра. /// </summary> [MethodImplAttribute(MethodImplOptions.Synchronized)] public void ChangeInstance() { // Действия метода. } /// <summary> /// Синхронизированный доступ к статической переменной /// </summary> [MethodImplAttribute(MethodImplOptions.Synchronized)] public static void ChangeStatic() { // Действия метода. } } } |
Листинг 7.13. |
Закрыть окно |