同步方法和异步方法是什么?

3

什么是同步方法和异步方法?同步方法和异步方法有什么区别?何时需要使用同步或异步方法?我问这些问题是因为我不理解:

public async void ReadData(filepath)
{
    CreateDoc("hello");    //<------ Why I can't do that ?
}

public void CreateDoc(string astring)
{
    Debug.WriteLine(astring);
}

我为什么不能那样做呢?:
public async void ReadData(filepath)
{
     var BarreDroite = new string[] { "|" };
     foreach (string tableArret in items.Split(BarreDroite, StringSplitOptions.RemoveEmptyEntries))
     {
         listeArret.Add(tableArret); //<---- Here appear the problem.
     }
{

我提出这个问题是因为我在网上没有找到清晰的解释。

我假设你已经找到了“某些东西”,那么你目前发现了什么?你实际上在这里问什么?是关于异步/同步的区别还是如何修复代码中的错误? - Sayse
2
我怀疑真正的问题是"为什么我的异步空void方法不起作用"。因为它们只应该用于事件处理程序。已经有很多关于它的帖子了,我们不需要再来一篇。感谢你的尝试和贡献。 - Hans Passant
Hans,除了事件处理程序之外,await 有许多用途。 - Jesse Liberty
最好改变问题,兄弟。 - r.hamd
如果一个方法是“async”,它应该返回一个“Task”。 - Matthieu H
2个回答

10

函数和其他操作都在“线程”上运行。线程只是一系列操作的字符串,但您可以同时拥有多个线程。在某些方面,最重要的线程是主线程,通常称为UI线程,因为这是控制用户界面的地方。

当执行长时间操作(例如从互联网获取数据)时,您不希望在主线程上等待该数据,因为这将“阻塞”该线程以响应用户输入(例如,单击取消按钮)。

为了解决这个问题,您需要将长时间运行的任务放在自己的线程上。C#使此变得容易,您只需使用await关键字,函数将等待工作完成而不会阻塞主线程。

单词await是一个“关键字”,其使用被保留用于此目的。要表示函数具有等待,必须使用async标记函数。如果标记为异步,则编译器将期望至少一个等待。

您的示例:

public async void ReadData(filepath)
{
    CreateDoc("hello");    //<------ Why I can't do that ?
}

您将此方法标记为异步,但您没有任何等待语句。
希望这可以帮助到您。
杰西

7
  1. 同步指的是两个或更多操作在同一上下文(线程)中运行,因此一个操作可能会阻塞另一个操作。
  2. 同步意味着两个或更多操作按顺序发生。
  3. 异步指的是两个或更多操作在不同的上下文(线程)中运行,因此它们可以并发运行而且不会相互阻塞。
  4. 异步意味着两个或更多操作是异步发生的。

您可以在以下主题中了解更多信息: http://www.codeproject.com/Articles/127660/What-are-actually-synchronous-asynchronous-operati


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接