0

パラメータでコンテキストを送信せずに、メイン関数と同じコンテキストで関数を非同期的に呼び出すことは可能ですか?

例えば

方法 1 :

  • いくつかの作業を行います...
  • Method2パラメータでコンテキストを送信せずに(タスクまたはデリゲートなどを使用して)非同期に呼び出します
  • 他の仕事をして...

方法 2 :

  • のコンテキストから開始しますMethod1(コンテキストを設定せずに)
  • いくつかの作業を行います...

サーバー上で実行することになっているコンソール (C#/.NET) プロジェクトに取り組んでいます。編集:言い忘れました:私はVS 2010で作業しています(Async/Awaitなし)
。個人的なオブジェクトがコンテキストで機能するため、これが必要です。

4

4 に答える 4

1

私があなたの質問を正しく理解していれば、おそらくそのためにプライベート属性が必要になるでしょう。それらの間で操作する必要があるすべてのプロパティを含むクラスを作成し、両方のメソッドがアクセスできる場所に保存します。次のようなもの:

//  Context class you create
public class Ctx{
    //  context data properties
    //  methods, etc
}


public class DoStuff{

    private Ctx context;


    public void M1(){
        context = new Ctx();
        //  do stuff

        //  use some beginInvoke or whatever
        //  to call M2()

        //  do the rest of your stuff
    }

    public void M2(){

        Ctx tmp = context;

        //  do stuff

    }
}

このようなものを共有すると同時実行性の問題が発生する可能性があることに注意してください。そのためには、スレッド セーフなコンテキスト クラスを作成するか、lock ステートメントでコンテキスト オブジェクトにのみアクセスするようにしてください。次のようなもの:

public class Ctx{
    public readonly Object _lock = new Object();

    private int v1 = 0;
    public int V1{
        get{
            lock(_lock)
                return v1;
        }
        set{
            lock(_lock)
                v1 = value;
        }
    }
}
于 2012-11-29T14:33:13.863 に答える
0

絶対。これを行うための一般的なパターンは、コンテキストで必要なすべてのものを単一のクラスオブジェクトにカプセル化することです。コンテキストが1つだけで、複数の同時呼び出しを行う予定がない場合は、コンテキストを独自のクラスに分離する必要はありません。(注:このショートカットを使用する前に、これに違反するエッジケースがないことを実際に確認する必要があります。)しかし、そうする方がはるかにクリーンであり、追加の作業はそれほど多くありません。

これを行うには多くの方法がありますが、そのうちの1つを以下に示します。

public class ExampleClass
{
    private object _myContextInfo; //This can be multiple objects, or a single structured object or whatever you need.
    public void Main()
    {
        _myContextInfo = new object();//Set this to whatever you need
        var bw = new BackgroundWorker();
        bw.DoWork += DoSomethingAsync;
        bw.RunWorkerCompleted += TakeActionOnCompletion;
        bw.RunWorkerAsync();

        //Do whatever you want done in parallel to your other item here
    }

    private void DoSomethingAsync(object sender, DoWorkEventArgs e)
    {
        //Do whatever you need and use the class fields however you want;
    }

    private void TakeActionOnCompletion(object sender, RunWorkerCompletedEventArgs e)
    {
        //Use the results however you need and read/manipulte the class fields however you want;
    }
于 2012-11-29T14:24:08.620 に答える
0

私は、あなたはこのようなことができると思います:

static void Method2() { }

static void Method1()
{
    var sc = SynchronizationContext.Current;
    sc.Post(delegate { Method2(); }, null);
}

私は await が彼と同様に実装されていることをどこかで読みました (残念ながらソースが見つかりません) これはあなたが探しているものですか?

于 2012-11-29T14:33:11.257 に答える
-1

別のメソッドを非同期で呼び出すには、そのメソッド用の新しいスレッドを作成します。そのスレッド内では、完了したらすぐにコールバック メソッドを呼び出すことができます。

ここに役立つかもしれないチュートリアルがあります。

于 2012-11-29T14:24:45.783 に答える