Ознакомьтесь с этой статьей, в которой описывается, как выполнять метод асинхронно, и используется обработчик событий, который запускается после завершения асинхронного вызова метода.
http://www.csharp -examples.net / создать асинхронный-метод /
Вот черновик того, как бы вы применили содержание статьи в вашей ситуации. Я не проверял код, поэтому он может быть не идеальным, но он должен быть близок.
Вам необходимо импортировать следующие пространства имен:
using System.Threading;
using System.ComponentModel;
using System.Runtime.Remoting.Messaging;
А вот примерная реализация:
//boolean flag which indicates whether the async task is running
private bool crawling = false;
private delegate bool CrawlWebsiteDelegate();
private bool CrawlWebsite()
{
//crawl the website
return false;
}
protected void Button1_Click(object sender, EventArgs e)
{
CrawlWebsiteDelegate worker = new CrawlWebsiteDelegate(CrawlWebsite);
AsyncCallback completedCallback = new AsyncCallback(CrawlWebsiteCompletedCallback);
if (!crawling)
{
worker.BeginInvoke(completedCallback, AsyncOperationManager.CreateOperation(null));
crawling = true;
}
}
private void CrawlWebsiteCompletedCallback(IAsyncResult ar)
{
//get the original worker delegate and the AsyncOperation instance
CrawlWebsiteDelegate worker = (CrawlWebsiteDelegate)((AsyncResult)ar).AsyncDelegate;
//finish the asynchronous operation
bool success = worker.EndInvoke(ar);
crawling = false;
if (success)
{
//perform sql tasks now that crawl has completed
}
}
РЕДАКТИРОВАТЬ : Вот код в VB.NET - не уверен, что весь синтаксис правильный
Private crawling As Boolean = False
Private Delegate Function CrawlWebsiteDelegate() As Boolean
Private Function CrawlWebsite() As Boolean
Return False
End Function
Protected Sub Button1_Click(sender As Object, e As EventArgs)
Dim worker As New CrawlWebsiteDelegate(AddressOf CrawlWebsite)
Dim completedCallback As New AsyncCallback(AddressOf CrawlWebsiteCompletedCallback)
If Not crawling Then
worker.BeginInvoke(completedCallback, AsyncOperationManager.CreateOperation(Nothing))
crawling = True
End If
End Sub
Private Sub CrawlWebsiteCompletedCallback(ar As IAsyncResult)
Dim worker As CrawlWebsiteDelegate = DirectCast(DirectCast(ar, AsyncResult).AsyncDelegate, CrawlWebsiteDelegate)
Dim success As Boolean = worker.EndInvoke(ar)
crawling = False
If success Then
DoSomeSqlTasks()
End If
End Sub