C#2008C#バックグラウンドワーカーのDoWorkをキャンセルする
ソフトフォンにログインするには、以下のコードを使用しています。しかし、初期化してチェックする必要があることが多いので、ログイン処理は長いプロセスですが、ここにはいくつかを載せておきます。
以下のコードでは、各チェックを行う前にCancelAsyncがキャンセルボタンのクリックイベントで呼び出された場合、CancellationPendingがチェックされています。これは正しいです?また、チェックが失敗した場合は、CancelAsyncを呼び出してe.Cancelをtrueに設定します。
私がここで使用した方法が使用するのが最良の方法であるかどうかを知りたいと思います。何かアドバイスのため
多くのおかげで、
private void bgwProcessLogin_DoWork(object sender, DoWorkEventArgs e)
{
/*
* Perform at test to see if the background worker has been
* cancelled by the user before attemping to continue to login.
*
* Cancel background worker on any failed attemp to login
*/
// Start with cancel being false as to reset this if cancel has been set to true
// in the cancel button.
e.Cancel = false;
NetworkingTest connection_test = new NetworkingTest();
if (!this.bgwProcessLogin.CancellationPending)
{
// Check local LAN or Wireless connection
if (!connection_test.IsNetworkConnected())
{
// Update label
if (this.lblRegistering.InvokeRequired)
{
this.lblRegistering.Invoke(new UpdateRegisterLabelDelegate(UpdateRegisterLabel), "No network connection");
}
else
{
this.lblRegistering.Text = "No network connection";
}
// Failed attemp
this.bgwProcessLogin.CancelAsync();
e.Cancel = true;
return;
}
// Report current progress
this.bgwProcessLogin.ReportProgress(0, "Network connected");
}
else
{
// User cancelled
e.Cancel = true;
return;
}
// Test if access to Server is available
if (!this.bgwProcessLogin.CancellationPending)
{
if (!connection_test.IsSIPServerAvailable())
{
// Update label
if (this.lblRegistering.InvokeRequired)
{
this.lblRegistering.Invoke(new UpdateRegisterLabelDelegate(UpdateRegisterLabel), "Server unavailable");
}
else
{
this.lblRegistering.Text = "Server unavailable";
}
// Failed attemp
this.bgwProcessLogin.CancelAsync();
e.Cancel = true;
return;
}
// Report current progress
this.bgwProcessLogin.ReportProgress(1, "Server available");
}
else
{
// User cancelled
e.Cancel = true;
return;
}
.
.
.
}
private void bgwProcessLogin_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Check for any errors
if (e.Error == null)
{
if (e.Cancelled)
{
// User cancelled login or login failed
}
else
{
// Login completed successfully
}
}
else
{
// Something failed display error
this.statusDisplay1.CallStatus = e.Error.Message;
}
}
private void bgwProcessLogin_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.lblRegistering.Text = e.UserState.ToString();
}
private void btnCancel_Click(object sender, EventArgs e)
{
// Cancel the logging in process
this.bgwProcessLogin.CancelAsync();
this.lblRegistering.Text = "Logged out";
}
ニースの回答。私はこれがSilverlightでもうまくいくことを期待していました。それはセキュリティの制限のためではないことが分かります。 Silverlight 4(http://msdn.microsoft.com/en-us/library/ty8d3wta(v=VS.95).aspx)の時点で、 'Thread.Abort()'を呼び出すとMethodAccessExceptionがスローされます。ああ、それはまだ良い答えです。 –
@ SergeyTeplyakovこんにちはSergey、私はまったく同じシナリオを持っています(キャンセルがクリックされた場合、中止したい1つの長い実行スレッド)が、あなたのコード/ポストから実際にキャンセルする方法は見ていません。私はバックグラウンドワーカーには新しいので、私の無知を許してください... – ganders