异步调用和上下文

时间:2012-11-29 14:12:11

标签: c# .net asynchronous

是否可以使用与main函数相同的上下文异步调用函数而不在参数中发送上下文?

For Instance

方法1

  • 做一些工作......
  • 异步调用Method2(使用taks或delegate等...)而不在参数中发送任何上下文
  • 做一些其他工作......

方法2

  • Method1的上下文开始(不设置上下文)
  • 做一些工作......

我正在开发一个应该在服务器上运行的控制台(C#/ .NET)项目。 编辑:我忘了说:我正在使用VS 2010(没有异步/等待) 我需要这个,因为一些个人物品与上下文一起工作。

4 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你可能需要一个私人属性。 您创建一个类,其中包含您需要在它们之间进行操作的每个Property,并将其存储在两个方法都可以访问的位置。 有点像:

//  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;
        }
    }
}

答案 1 :(得分:0)

绝对。执行此操作的常见模式是将上下文中所需的所有内容封装到单个类对象中。如果您只有一个上下文,并且不打算进行多个并发调用,则不必将其分隔到自己的类中。 (注意:在使用此快捷方式之前,您需要确保没有违反此规则的边缘情况。)但这样做更干净,并且没有太多额外的工作。

有很多方法可以做到这一点,其中一个是下面的。

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;
    }

答案 2 :(得分:0)

我想,你可以这样做:

static void Method2() { }

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

我在某个地方读到等待实现类似于他(我不太可能找到我的来源) 这是你在找什么?

答案 3 :(得分:-1)

要异步调用另一个方法,我将为该方法创建一个新线程。在该线程中,您仍然可以在完成后立即调用回调方法。

Here's a tutorial that might help.