私のマルチスレッドの知識はまだまだ基本的なものであり、ここではいくつかの参考になるでしょう。私は次のメソッドを持つインタフェース、(WCF)からIOperationInvoker持っている:このインタフェースの具体的な実装を考えると非同期操作内の非同期操作
IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
を、私は別々のスレッドで基礎となる実装を呼び出しながら、同じインターフェイスを実装する必要があります。 (理由を疑問に思っている場合は、具体的な実装は別のアパートメント状態にある必要があるレガシーCOMオブジェクトを呼び出します)。私は私自身で返さAsyncResultをラップする必要があると思っていたので、私は戻って私たちがきたスレッドに取得することができます
public StaOperationSyncInvoker : IOperationInvoker {
IOperationInvoker _innerInvoker;
public StaOperationSyncInvoker(IOperationInvoker invoker) {
this._innerInvoker = invoker;
}
public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
Thread t = new Thread(BeginInvokeDelegate);
InvokeDelegateArgs ida = new InvokeDelegateArgs(_innerInvoker, instance, inputs, callback, state);
t.SetApartmentState(ApartmentState.STA);
t.Start(ida);
// would do t.Join() if doing syncronously
// how to wait to get IAsyncResult?
return ida.AsyncResult;
}
public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
// how to call invoke end on the
// thread? could we have wrapped IAsyncResult
// to get a reference here?
return null;
}
private class InvokeDelegateArgs {
public InvokeDelegateArgs(IOperationInvoker invoker, object instance, object[] inputs, AsyncCallback callback, object state)
{
this.Invoker = invoker;
this.Instance = instance;
this.Inputs = inputs;
this.Callback = callback;
this.State = state;
}
public IOperationInvoker Invoker { get; private set; }
public object Instance { get; private set; }
public AsyncCallback Callback { get; private set; }
public IAsyncResult AsyncResult { get; set; }
public Object[] Inputs { get; private set; }
public Object State { get; private set; }
}
private static void BeginInvokeDelegate(object data)
{
InvokeDelegateArgs ida = (InvokeDelegateArgs)data;
ida.AsyncResult = ida.Invoker.InvokeBegin(ida.Instance, ida.Inputs, ida.Callback, ida.State);
}
}
:現時点では
、私はこのような何かをやっていますスプールアップされました...しかし、正直言って私は少し深みがあります。すべてのポインタ?
多くのおかげで、
ジェームズ
非常にありがとうございます。バリー - 私はそれを行こうと思います! –