Создание Windows-приложений на основе Visual C#

         

и открываем файл. 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.
Закрыть окно
Содержание раздела