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

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

有很多方法可以做到这一点,其中之一如下。

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 回答