我应该将AsyncCallback创建为新对象,并且EndInvoke是可选的吗?

时间:2011-12-14 10:14:25

标签: c# asynchronous

我正在尝试使用异步调用来保存数据库,并且我已经意识到我对工作原理的理解可能是不正确的。我已经完成了一些谷歌搜索,但它没有帮助减少我的困惑

我所拥有的内容类似于以下内容:

private delegate bool MyDelegate();

private void ExportButton_Click(object sender, EventArgs e)
{
    // Disable button
    exportButton.Enabled = false;

    MyDelegate deleg = ExportDatabase;

    // Begin the export
    deleg.BeginInvoke(ExportDatabaseCallback, null);
}

public bool ExportDatabase()
{
    // Do Stuff
    return true;
}

private void ExportDatabaseCallback(IAsyncResult ar)
{
    // Enable button
    Invoke((MethodInvoker)delegate { exportButton.Enabled = true; });

    MessageBox.Show("Exporting Database complete");
}

现在,看看其他页面似乎在我的BeginInvoke中表明我应该这样做:deleg.BeginInvoke(new AsyncCallback(ExportDatabaseCallback), null);但是我有什么工作,所以我在这里做错了吗?

另一件事是我相信我的回调我应该调用EndInvoke(),因为其他stackoverflow问题表明它不是可选的。但其他地方似乎呢?但我能找到的大多数评论都来自2009年,我不知道自那时以来情况是否发生了变化。这是从ExportDatabase获取bool的唯一方法吗?

1 个答案:

答案 0 :(得分:2)

 new AsyncCallback(ExportDatabaseCallback)

只是创建委托的旧的,更长的方式。您的代码完全相同。

EndInvoke()有时是可选的,但您不想知道何时何时不知道。只要打电话,你就永远是对的。