Asynchronous 瓦拉产量不回

Asynchronous 瓦拉产量不回,asynchronous,gtk,yield,glib,vala,Asynchronous,Gtk,Yield,Glib,Vala,在Vala中编写异步函数时遇到问题。 我知道函数的回调必须在某个地方注册,以便在yield语句之后继续执行,因此我将其添加到GLib mainloop中,以便使用Idle.add定期调用。这是我的伪代码: async void loop_func() { var id = Idle.add(loop_func.callback); message("Added idle %u",id); yield; message("yielde

在Vala中编写异步函数时遇到问题。
我知道函数的回调必须在某个地方注册,以便在yield语句之后继续执行,因此我将其添加到GLib mainloop中,以便使用
Idle.add
定期调用。这是我的伪代码:

async void loop_func()
{
    var id = Idle.add(loop_func.callback);
    message("Added idle %u",id);

    yield;
    message("yielded successfully 1");

    yield;
    message("yielded successfully 2");

    for (var i = 0; i < 20; i++)
    {
        message("%d",i);
        yield;
    }

    message("finished");
}

int main()
{
    var loop = new GLib.MainLoop();
    loop_func.begin(() => {loop.quit();});
    loop.run();
    return 0;
}
然后它就挂了。

这里我遗漏了什么?

尽管GLib反复调用空闲函数直到它告诉它停止(返回
false
),异步函数的
.callback
似乎在被调用后立即停止重复

这可以通过每次在yield语句之前再次添加回调来克服:

async void loop_func()
{
    for (var i = 0; i < 20; i++)
    {
        Idle.add(loop_func.callback);
        yield;
    }
}
async void loop_func()
{
对于(变量i=0;i<20;i++)
{
Idle.add(循环函数回调);
产量
}
}
另一种(可能更有效)方法是忽略异步函数回调返回的值:

async void loop_func()
{
    var id = Idle.add(() => {loop_func.callback(); return Source.CONTINUE;});

    for (var i = 0; i < 20; i++)
    {
        yield;
    }

    Source.remove(id);
}
async void loop_func()
{
var id=Idle.add(()=>{loop_func.callback();返回Source.CONTINUE;});
对于(变量i=0;i<20;i++)
{
产量
}
来源。删除(id);
}

尽管GLib反复调用空闲函数直到它告诉它停止(通过返回
false
),异步函数的
.callback
似乎在被调用后立即停止重复

这可以通过每次在yield语句之前再次添加回调来克服:

async void loop_func()
{
    for (var i = 0; i < 20; i++)
    {
        Idle.add(loop_func.callback);
        yield;
    }
}
async void loop_func()
{
对于(变量i=0;i<20;i++)
{
Idle.add(循环函数回调);
产量
}
}
另一种(可能更有效)方法是忽略异步函数回调返回的值:

async void loop_func()
{
    var id = Idle.add(() => {loop_func.callback(); return Source.CONTINUE;});

    for (var i = 0; i < 20; i++)
    {
        yield;
    }

    Source.remove(id);
}
async void loop_func()
{
var id=Idle.add(()=>{loop_func.callback();返回Source.CONTINUE;});
对于(变量i=0;i<20;i++)
{
产量
}
来源。删除(id);
}

我不清楚当一个异步函数有多个
产量时会发生什么语句。您是从提供更多上下文的地方得到这个示例的吗?我想在for循环中执行一些昂贵的操作,但在每次迭代后将控制权交还给CPU,以阻止线程挂起。每次我在循环的一次迭代后让步时,我希望在CPU再次空闲时继续执行。我现在已经找到了这样做的方法;谢谢你的帮助!
yield
的目的是安排一个异步回调,因此当耗时的操作在一个单独的函数中完成时,流返回到yield,GIO有很多异步函数,例如
yield file.mount\u mountable(MountMountFlags.NONE)是的,有很多异步函数的例子,其中有多个
产生一些其他的异步函数()但我找不到具有多个
产量的。我不清楚当一个异步函数有多个
产量时会发生什么语句。您是从提供更多上下文的地方得到这个示例的吗?我想在for循环中执行一些昂贵的操作,但在每次迭代后将控制权交还给CPU,以阻止线程挂起。每次我在循环的一次迭代后让步时,我希望在CPU再次空闲时继续执行。我现在已经找到了这样做的方法;谢谢你的帮助!
yield
的目的是安排一个异步回调,因此当耗时的操作在一个单独的函数中完成时,流返回到yield,GIO有很多异步函数,例如
yield file.mount\u mountable(MountMountFlags.NONE)是的,有很多异步函数的例子,其中有多个
产生一些其他的异步函数()但我找不到具有多个
产量的
MainLoop
是对
GMainContext
的抽象,它是GLib的事件循环,可以为每个线程或多个线程创建,允许多个事件循环,如果您试图将流控制添加到耗时的操作中,但希望维护一个单独的响应线程,例如用于用户输入,然后可以查看灵感
MainLoop
是对
GMainContext
的抽象,它是GLib的事件循环,可以为每个线程或更多线程创建,允许多个事件循环,如果您试图将流控制添加到耗时的操作中,但希望维护一个单独的响应线程,例如,对于用户输入,则可以查看以获取灵感