在异步方法中调用sysnc方法?

时间:2017-11-21 13:24:03

标签: c# oop asynchronous async-await synchronization

我是Async Programming的新手。我想知道我是否有异步方法,我是否在我的方法中调用同步方法?如果是的话,它有什么优势? 这是示例代码:

public async Task ParseFile(int requestId) {
     await BulkInsertFileRecords(requestId) ;
     GetInfo();//it’s sysnc method
}

protected async Task BulkInsertFileRecords(int requestId) {
   BulkInsert(requestId);// it’s sysnc method
}

2 个答案:

答案 0 :(得分:0)

你绝对可以从异步方法调用同步方法。这些方法将以通常的方式运行,即在异步方法的上下文中同步运行。

当然,简单地将同步方法包装到async方法中不会给同步方法带来异步执行的任何优势:您的BulkInsertFileRecords将完全按照调用{{1}时的方式运行直接。事实上,由于BulkInsert内部没有BulkInsertFileRecords,因此根本不能保留await。您可以将其重写为async同步方法,并在不使用void的情况下调用它:

await

答案 1 :(得分:0)

应该注意的是,如果同步方法应该以某种方式改变您的用户界面,那么您可能得到的结果并不是您所期望的。

UI绑定到的数据必须具有它的属性更改触发器才会在主UI线程上下文中发生。

如果您调用的同步方法需要此方法,您仍然可以调用该方法,但需要额外的代码以确保从相应的线程调用它。

import { MatTabChangeEvent } from '@angular/material';

public tabChanged(tabChangeEvent: MatTabChangeEvent): void {
    console.log(tabChangeEvent);
}

这将确保调用从异步线程同步发生,同时也在主线程上执行。如果您只是需要在主线程上进行调用,并且不想等待,则可以调用InvokeAsync。