接口

GioAsyncResult

说明 [源代码]

interface Gio.AsyncResult : GObject.Object

GAsyncResult 为实现异步函数结果提供一个基本类。

异步操作分为两个独立的操作,这些操作通过 GAsyncReadyCallback 相互连接。要开始一项异步操作,请向异步函数提供一个 GAsyncReadyCallback。当操作完成后会触发该回调,并且该回调必须在操作发起所在线程的默认主上下文的稍后迭代中运行(请参见 g_main_context_push_thread_default())。它会传入一个 GAsyncResult 实例,其中填入了该操作成功或失败的详细信息、为其启动异步函数的对象和返回的任何错误代码。然后预计异步回调函数会调用相应的 _finish() 函数,传入该函数被调用的对象、GAsyncResult 实例,以及(可选)获取可能发生的任何错误情况的 error

一项操作的 _finish() 函数获取通用结果(类型为 GAsyncResult)并返回该操作产生的特定结果(例如,“枚举子项”操作的 GFileEnumerator)。如果不需操作的结果或错误状态,则无需调用 _finish() 函数;在 GAsyncReadyCallback 返回后,GIO 将负责清理结果和错误信息。如果在操作完成后无需执行任何操作,则可以将 GAsyncReadyCallback 传递为 NULL。应用程序还可以引用 GAsyncResult 并稍后调用 _finish();但是,_finish() 函数最多只能调用一次。

典型异步操作流程的示例

void _theoretical_frobnitz_async (Theoretical         *t,
                                  GCancellable        *c,
                                  GAsyncReadyCallback  cb,
                                  gpointer             u);

gboolean _theoretical_frobnitz_finish (Theoretical   *t,
                                       GAsyncResult  *res,
                                       GError       **e);

static void
frobnitz_result_func (GObject      *source_object,
         GAsyncResult *res,
         gpointer      user_data)
{
  gboolean success = FALSE;

  success = _theoretical_frobnitz_finish (source_object, res, NULL);

  if (success)
    g_printf ("Hurray!\n");
  else
    g_printf ("Uh oh!\n");

  ...

}

int main (int argc, void *argv[])
{
   ...

   _theoretical_frobnitz_async (theoretical_data,
                                NULL,
                                frobnitz_result_func,
                                NULL);

   ...
}

异步操作的回调只调用一次,并且总是调用,即使在已取消的操作中也会调用。在取消操作时,结果会是 G_IO_ERROR_CANCELLED 错误。

I/O 优先级

许多与 I/O 相关的异步操作都有一个优先级参数,在某些情况下,此参数用于确定执行操作的顺序。它们不用于确定系统范围内的 I/O 调度。优先级为整数,数字越低表示优先级越高。我们建议你选择介于 G_PRIORITY_LOWG_PRIORITY_HIGH 之间的优先级,以 G_PRIORITY_DEFAULT 作为首选的默认值。

先决条件

为了实现 AsyncResult,你的类型必须从 GObject 继承。

实现方式

实例方法

g_async_result_get_source_object

GAsyncResult 中获取源对象。

g_async_result_get_user_data

GAsyncResult 中获取用户数据。

g_async_result_is_tagged

检查 res 是否具有给定的 source_tag(通常是指示创建 res 的函数的函数指针)。

since: 2.34

g_async_result_legacy_propagate_error

如果 res 是一个 GSimpleAsyncResult,则这等效于 g_simple_async_result_propagate_error()。否则,它返回 FALSE

since: 2.34

接口结构

struct GioAsyncResultIface {
  GTypeInterface g_iface;
  gpointer (* get_user_data) (
    GAsyncResult* res
  );
  GObject* (* get_source_object) (
    GAsyncResult* res
  );
  gboolean (* is_tagged) (
    GAsyncResult* res,
    gpointer source_tag
  );
  
}

GAsyncResult 定义的接口。

接口成员
g_iface
GTypeInterface
 

父接口。

get_user_data
gpointer (* get_user_data) (
    GAsyncResult* res
  )
 

获取传递给回调函数的用户数据。

get_source_object
GObject* (* get_source_object) (
    GAsyncResult* res
  )
 

获取发出异步操作的源对象。

is_tagged
gboolean (* is_tagged) (
    GAsyncResult* res,
    gpointer source_tag
  )
 

检查结果是否标记有特定的源。

虚拟方法

Gio.AsyncResult.get_source_object

GAsyncResult 中获取源对象。

Gio.AsyncResult.get_user_data

GAsyncResult 中获取用户数据。

Gio.AsyncResult.is_tagged

检查 res 是否具有给定的 source_tag(通常是指示创建 res 的函数的函数指针)。

since: 2.34