Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步调用和上下文_C#_.net_Asynchronous - Fatal编程技术网

C# 异步调用和上下文

C# 异步调用和上下文,c#,.net,asynchronous,C#,.net,Asynchronous,是否可以使用与主函数相同的上下文异步调用函数,而不发送参数中的上下文 例如 方法1: 做一些工作 异步调用Method2(使用TAK或委托等),而不在参数中发送任何上下文 做一些其他的工作 方法2: 从Method1的上下文开始(不设置上下文) 做一些工作 我正在做一个控制台(C#/.NET)项目,该项目应该在服务器上运行。 编辑:我忘了说:我正在使用VS2010(无异步/等待) 我之所以需要它,是因为某些个人对象与上下文一起工作。绝对如此。实现这一点的常见模式是将上下文中所需的所有内容

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

例如 方法1

  • 做一些工作
  • 异步调用
    Method2
    (使用TAK或委托等),而不在参数中发送任何上下文
  • 做一些其他的工作
方法2

  • Method1
    的上下文开始(不设置上下文)
  • 做一些工作
我正在做一个控制台(C#/.NET)项目,该项目应该在服务器上运行。 编辑:我忘了说:我正在使用VS2010(无异步/等待)

我之所以需要它,是因为某些个人对象与上下文一起工作。

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

有很多方法可以做到这一点,下面就是其中之一

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

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


我想,你可以这样做:

static void Method2() { }

static void Method1()
{
    var sc = SynchronizationContext.Current;
    sc.Post(delegate { Method2(); }, null);
}
我在某个地方读到,wait的实现与他的类似(不幸的是,我找不到我的源代码)
这就是你想要的吗?

如果我正确理解了你的问题,你可能需要一个私有属性。 创建一个类,其中包含需要在它们之间操作的每个属性,并将其存储在两个方法都可以访问的位置。 大致如下:

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

方法2将如何确定使用哪种上下文?这是我问题的主题。。。是否有可能在Method2中不做任何操作就设置上下文。调用方法1就可以了。显然有上百种风格模式和实践的意见,哪种方式是最好的,但我选择简单地回答张贴的问题,远离任何模式和实践评论。谢谢你的帮助!我现在可以随心所欲地使用它了。这不是我想要的。你甚至没有提到同步上下文,这就是问题所在。这不是关于如何异步执行函数的问题,有一个解决方案是BackgroundWorker对象,它基本上也是线程,但更方便。我不知道那件事。它还涉及并发性。@Servy同步上下文在中提到。但你是对的,我应该明确地把它放在这里。我已经试过了,它不起作用。但我现在很好,谢谢。