C# wcf中的阻塞和异步

C# wcf中的阻塞和异步,c#,multithreading,wcf,asynchronous,C#,Multithreading,Wcf,Asynchronous,此示例部分取自stack public async Task MyMethod(string s1,sring s2) { Trace.TraceInformation("info"); //check input if (s1 == null || s2 == null) Trace.TraceInformation("error"); Task<int> longRunningTask = LongRunningOperation

此示例部分取自stack

public async Task MyMethod(string s1,sring s2)
{
    Trace.TraceInformation("info");
    //check input
    if (s1 == null || s2 == null)
        Trace.TraceInformation("error");

    Task<int> longRunningTask = LongRunningOperation();
    //indeed you can do independent to the int result work here 

    //and now we call await on the task 
    int result = await longRunningTask;
    //use the result 
    Console.WriteLine(result);
}

public async Task<int> LongRunningOperation() // assume we return an int from this long running operation 
{
    await Task.Delay(1000); //1 seconds delay
    return 1;
}
公共异步任务MyMethod(字符串s1,sring s2)
{
Trace.TraceInformation(“信息”);
//检查输入
如果(s1==null | | s2==null)
跟踪信息(“错误”);
Task longRunningTask=LongRunningOperation();
//实际上,您可以在这里独立于int结果进行工作
//现在我们呼吁等待这项任务
int result=等待长时间运行任务;
//使用结果
控制台写入线(结果);
}
公共异步任务LongRunningOperation()//假定此长时间运行的操作返回int
{
等待任务。延迟(1000);//延迟1秒
返回1;
}
我希望MyMethod不被阻塞

1.在
Task longRunningTask=LongRunningOperation()之前
用户被阻止了?我是否也应该异步运行上述代码部分(跟踪和输入检查)?如果是,如何?有没有一种不用新的异步方法实现的方法

2.当我们开始时:

Task<int> longRunningTask = LongRunningOperation(); 
Task longRunningTask=LongRunningOperation();
开始执行
LongRunningOperation
我们假设主线程(线程ID=1)完成了独立的工作,然后等待
longRunningOperation
完成

现在,如果longRunningOperation尚未完成且仍在运行MyMethod(),则将返回其调用方法,从而主线程不会被阻塞。当longRunningOperation完成后,线程池中的一个线程(可以是任何线程)将返回到MyMethod(),并继续执行(在本例中,将结果打印到控制台)

第二种情况是longRunningOperation已经完成了执行,并且结果可用。当到达
await longlunningoperation
时,编译器知道它有结果,并将继续在同一线程上执行代码。(在这种情况下,将结果打印到控制台)

3.如果在异步方法期间引发异常,会发生什么情况


4.如果提供了同步实现,我可以使用它吗?如何使用?

1。关于代码重新发送给用户的位置,您是不正确的

直到
int result=等待长时间运行任务的所有内容
与调用
MyMethod(
)的函数在同一线程上运行,而不是
Task longRunningTask=LongRunningOperation();
调用

如果希望函数的同步部分也在后台线程中运行,请在
Task.run(

然后,您可以
等待
或返回任务所需的任何内容

2.如果
longRunningTask
在到达
Wait longRunningTask
时已完成,则函数仍将继续在同一线程上运行,并且在到达函数末尾之前不会返回调用者。当函数到达函数末尾时,它将返回调用者,并且已在compl中包含
Task
国家

如果未完成
longRunningTask
,它将在
Wait
点返回调用者,并返回一个
Task
,该任务将在函数完成时从
Running
状态变为
Completed
状态。当
Wait
返回时,它将使用任务启动时处于活动状态的如果您在点击
wait
时在UI线程上的何处,工作将继续,默认情况下,如果未设置
SynchronizationContext
,它将使用线程池线程继续工作

3.如果抛出异常,则当
等待longRunningTask
返回时会看到异常(或者如果将函数包装在
Task.Run(
)中,则父线程会返回)

4.同步实现应使用单独的方法。请参阅两篇Microsoft博客文章“”和“”

var myMethodTask = Task.Run(() => MyMethod("foo", "bar"));