41. 协程中的launch 和 async (OpenAI翻译)

本文探讨了Kotlin协程中launch和async的区别。launch用于启动协程但不返回结果,返回Job对象用于管理任务;而async返回一个Deferred,可以使用await()获取结果。异常处理方面,launch中的异常未处理会导致应用崩溃,async则会默默地丢弃异常,除非被捕获。在实际应用中,应根据是否需要返回结果和异常处理需求选择使用launch或async。
摘要由CSDN通过智能技术生成

在本文中,我们将学习Kotlin协程中的“launch”和“async”的区别,以及何时使用它们。
“launch”和“async”都是在Kotlin中启动协程的函数。

launch{}
async{}

它们之间的不同之处在于,“launch{}”返回一个“Job”对象,不传递任何结果值,而“async{}”返回一个“Deferred”实例,它有一个“await()”函数,返回协程的结果,就像Java中的Future一样,在其中我们使用future.get()来获取结果。

换句话说:

  • “launch”:启动并忘记。
  • “async”:执行任务并返回结果。
    让我们拿一个例子来学习“launch”和“async”的区别。

我们可以如下使用“launch”:

val job = GlobalScope.launch(Dispatchers.Default) {
    // do something and do not return result
}

“launch”返回一个“Job”对象,我们可以使用它来获取任务的状态或取消任务执行。

在上面“launch”的例子中,我们需要做某些事情,但不需要将结果返回。

但是,当我们需要返回结果时,我们需要使用“async”。

val deferredJob = GlobalScope.async(Dispatchers.Default) {
    // do something and return result, for example 10 as a result
    return@async 10
}
val result = deferredJob.await() // result = 10

接下来,我们将使用await()获取结果。

在“async”中,我们也可以使用Deferred job对象来获取任务的状态或取消它。

注意:我在快速示例中使用了GlobalScope,我们应该尽量避免使用它。在Android项目中,我们应该根据我们的用例使用自定义范围,如lifecycleScope、viewModelScope等。

“launch”和“async”的另一个区别是异常处理。

如果在“launch”块中出现任何异常,如果我们没有处理它,则会导致应用程序崩溃。

但是,如果在“async”块中出现任何异常,则它将存储在生成的“Deferred”中,并且不会传递到其他任何地方,它将被默默地丢弃,除非我们对其进行处理。

让我们通过代码示例理解这个区别。

假设我们有一个函数执行某个操作并抛出异常:

private fun doSomethingAndThrowException() {
    throw Exception("Some Exception")
}

现在我们使用“launch”调用它:

GlobalScope.launch {
    doSomethingAndThrowException()
}

如预期的那样,这将导致应用程序崩溃。

我们可以通过以下方式处理它:

GlobalScope.launch {
    try {
        doSomethingAndThrowException()
    } catch (e: Exception) {
        // handle exception
    }
}

现在,异常将进入catch块,我们可以处理它。

现在我们使用“async”调用它:

GlobalScope.async {
    doSomethingAndThrowException()
}

应用程序不会崩溃。异常将被静默地丢弃。

同样,我们可以通过以下方式处理它:

GlobalScope.async {
    try {
        doSomethingAndThrowException()
    } catch (e: Exception) {
        // handle exception
    }
}

现在,异常将进入catch块,我们可以处理它。

让我总结一下“launch”和“async”的区别:

LaunchAsync
Fire and forget.执行任务并返回结果
launch{}返回一个Job,不携带任何结果值。async{}返回一个Deferred的实例,它有一个await()函数来返回coroutine的结果。
如果在启动块中出现任何异常,如果我们没有处理它,就会使应用程序崩溃。如果任何异常出现在异步块内,它将被存储在产生的递延内,不会被传递到其他地方,除非我们处理它,否则它将被默默地丢弃。

所以,我们已经了解了启动函数和异步函数之间的区别。

原文链接

好的,下面我来回答你的问题。 前面已经讲过了如何在Windows上安装OpenCV和配置tasks.json文件,接下来我们来配置launch.json文件。 launch.json文件用于配置调试器(Debugger)的启动方式,可以让你在vscode方便地调试你的程序。下面是配置launch.json文件的步骤: 1. 在vscode的菜单栏选择“调试(Debug)” -> “添加配置(Add Configuration)”。 2. 选择“C++ (GDB/LLDB)”作为调试器。 3. 在打开的launch.json文件输入以下配置信息: ``` { "version": "0.2.0", "configurations": [ { "name": "Debug", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/your_executable_file.exe", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "C:/MinGW/bin/gdb.exe", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "build" } ] } ``` 其,name表示配置的名称,program表示要运行的可执行文件,miDebuggerPath表示gdb的路径,preLaunchTask表示在启动调试器前要执行的任务,需要根据自己的文件名和路径进行修改。 4. 保存launch.json文件,并在vscode的菜单栏选择“调试(Debug)” -> “启动调试器(Start Debugging)”来启动调试器。 这样就可以配置好vscode的tasks.json和launch.json文件了。希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值