remoting异步回调的时候,如果是用户误操作,如何在操作完成之前,中断这个异步回调?以下面代码为例,如果点了button1之后,在GetUserInfoCallback完成之前,中断(取消)GetUserInfoCallback的执行.
private void button1_Click(object sender, EventArgs e)
{
RegisterChannel();
Rem.User user= (Rem.User)Activator.GetObject(typeof(Rem.User),"tcp://localhost:6666/User");
bool success;
string errorString; Delegate.GetUserInfo getUserInfoDelegate = new Delegate.GetUserInfo(user.GetUserInfo);
AsyncCallback callback=new AsyncCallback(GetUserInfoCallback); IAsyncResult iar= getUserInfoDelegate.BeginInvoke(txtUserName.Text, txtPassword.Text, out success, out errorString, callback, null);
} private void GetUserInfoCallback(IAsyncResult iar)
{ AsyncResult ar = (AsyncResult)iar;
Delegate.GetUserInfo getUserInfoDelegate = ar.AsyncDelegate as Delegate.GetUserInfo; if (iar.IsCompleted)
{
bool success;
string errorString;
DataSet ds = getUserInfoDelegate.EndInvoke(out success, out errorString, iar); if (success)
{
SetDataSource(dataGridView1, ds.Tables[0]);
}
else
{
SetDataSource(dataGridView1, null);
MessageBox.Show(errorString);
}
}
else
{
MessageBox.Show("正在进行...");
}
} delegate void SetDataSourceCallback(DataGridView dgv, DataTable dt); private void SetDataSource(DataGridView dgv, DataTable dt)
{
if (dgv.InvokeRequired)
{
SetDataSourceCallback d = new SetDataSourceCallback(SetDataSource);
this.Invoke(d, new object[] {dgv, dt });
}
else
{
dgv.DataSource= dt;
}
}
private void button1_Click(object sender, EventArgs e)
{
RegisterChannel();
Rem.User user= (Rem.User)Activator.GetObject(typeof(Rem.User),"tcp://localhost:6666/User");
bool success;
string errorString; Delegate.GetUserInfo getUserInfoDelegate = new Delegate.GetUserInfo(user.GetUserInfo);
AsyncCallback callback=new AsyncCallback(GetUserInfoCallback); IAsyncResult iar= getUserInfoDelegate.BeginInvoke(txtUserName.Text, txtPassword.Text, out success, out errorString, callback, null);
} private void GetUserInfoCallback(IAsyncResult iar)
{ AsyncResult ar = (AsyncResult)iar;
Delegate.GetUserInfo getUserInfoDelegate = ar.AsyncDelegate as Delegate.GetUserInfo; if (iar.IsCompleted)
{
bool success;
string errorString;
DataSet ds = getUserInfoDelegate.EndInvoke(out success, out errorString, iar); if (success)
{
SetDataSource(dataGridView1, ds.Tables[0]);
}
else
{
SetDataSource(dataGridView1, null);
MessageBox.Show(errorString);
}
}
else
{
MessageBox.Show("正在进行...");
}
} delegate void SetDataSourceCallback(DataGridView dgv, DataTable dt); private void SetDataSource(DataGridView dgv, DataTable dt)
{
if (dgv.InvokeRequired)
{
SetDataSourceCallback d = new SetDataSourceCallback(SetDataSource);
this.Invoke(d, new object[] {dgv, dt });
}
else
{
dgv.DataSource= dt;
}
}
你看下BackgroundWorker组件,虽然有提供WorkerSupportsCancellation属性,让你设置你的方法是否支持取消动作,但是那也要你的方法支持取消才可以.也就是你的方法在长时间运算的过程中要检测是否有请求取消的动作,也就是CancellationPending是否被设置成true,才停止运行的.
也就是你的代码需要在GetUserInfo方法判断一个是否取消的标志,不然是没办法的
public static KidReturnObject GetPersonInfo(string userName, string password)
{
KidReturnObject result = new KidReturnObject(); string sql = string.Format("select * from person where name='{0}'", userName); // Database db = DatabaseFactory.CreateDatabase("ConnYuJing");
//DataSet ds = db.ExecuteDataSet(CommandType.Text, sql); using (SqlConnection conn = new SqlConnection(ConnString.YuJing))
{
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet();
da.Fill(ds); if (ds.Tables[0].Rows.Count > 0)
{
if (ds.Tables[0].Rows[0][ColumnName.Person.Password].ToString().Equals(password))
{
result.ExecuteSuccess= true;
result.ReturnObject = ds;
}
else
{
result.ExecuteSuccess = false;
result.ErrorLevel = ErrorLevel.Low;
result.ErrorString= "密码错误!";
}
}
else
{
result.ExecuteSuccess = false;
result.ErrorString="用户不存在!";
} return result ; }
}
呵呵好几年不搞Remoting,我在csdn上看到这类回复还真是很高兴。