私は非同期メソッド呼び出しをサポートするクラスを開発しようとしています。これは私が今までに思い付いたことですが、私はそれが正しいのかどうかは分かりません。非同期実装
私はasyncメソッドを一度実行したいだけで、複数の実行をサポートする必要はないので、AsyncOperationManager
クラスを使用しませんでした。
非同期パターンをよく知っている人は、フィードを返すことができますか?私はこれを正しい方法でやっていますか?
私は単一呼び出しの非同期メソッドに関する情報を見つけることができなかったので、助けてください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
namespace ConsoleApplication1 {
public delegate void WorkerDelegate();
class Program {
static void Main(string[] args) {
String taskId = new Guid().ToString();
AsyncTest test = new AsyncTest();
test.DoSomethingLongAsyncCompleted += new AsyncCompletedEventHandler(test_DoSomethingLongAsyncCompleted);
test.DoSomethingLongProgressChanged += new ProgressChangedEventHandler(test_DoSomethingLongProgressChanged);
test.DoSomethingLongAsync(ItsOver, taskId);
// Cancel after 2 seconds
Thread.Sleep(2000);
test.DoSomethingLongCancelAsync();
Console.ReadLine(); //Pause the console window
}
static void test_DoSomethingLongProgressChanged(object sender, ProgressChangedEventArgs e) {
Console.WriteLine("Percent complete: " + e.ProgressPercentage);
}
static void test_DoSomethingLongAsyncCompleted(object sender, AsyncCompletedEventArgs e) {
Console.WriteLine("Cancelled? " + e.Cancelled);
Console.WriteLine("Task ID: " + (String)e.UserState);
}
static void ItsOver(IAsyncResult r) {
Console.WriteLine("Task ID: " + (String)r.AsyncState);
}
}
class AsyncTest {
IAsyncResult _asyncResult = null;
Object _stateObj = null;
AsyncCallback _callBackDelegate;
public event ProgressChangedEventHandler DoSomethingLongProgressChanged;
public event AsyncCompletedEventHandler DoSomethingLongAsyncCompleted;
public IAsyncResult DoSomethingLongAsync(AsyncCallback userCallback, Object userState) {
if (_stateObj != null)
throw new InvalidOperationException("Method already started");
WorkerDelegate worker = new WorkerDelegate(DoSomethingLong);
_callBackDelegate = userCallback;
_asyncResult = worker.BeginInvoke(null, userState);
return _asyncResult;
}
public void DoSomethingLongCancelAsync() {
_stateObj = null;
}
public void DoSomethingLong() {
// Set state object if method was called synchronously
if (_stateObj == null)
_stateObj = new Object();
for (int i = 0; i < 10; i++) {
//If state object is null, break out of operation
if (_stateObj == null) break;
Thread.Sleep(1000);
Console.WriteLine("Elapsed 1sec");
if (DoSomethingLongProgressChanged != null) {
// Percentage calculation for demo only :-)
DoSomethingLongProgressChanged(this, new ProgressChangedEventArgs(i+1 * 10, _stateObj));
}
}
// Only execute if method was called async
if (_callBackDelegate != null) {
_callBackDelegate(_asyncResult);
DoSomethingLongAsyncCompleted(
this,
new AsyncCompletedEventArgs(null, (_stateObj == null), _asyncResult.AsyncState)
);
}
}
}
}
ご返信ありがとうございます。 MSDNで見たすべての記事では、単一のInvokationsについては説明していませんが、私はこれをチェックします。再度、感謝します。 –
サンプルEventModelでコード更新を追加しました。これが役立つかどうかを見てください。 – bendewey
コードサンプルのヒープを感謝します。私が何を見つけることができるかを知るために読書を続けてください。 私は代わりにBackgroundWorkerクラスを使用すると考えるかもしれません。 –