我有一个按钮,它启动程序和称为 DDC 的机器之间的连接。为了防止在建立连接时UI线程被锁定,我自然而然地创建了一个backgroundworker来处理这个工作。
问题是这样的:如果客户端没有从 DDC 得到任何响应,客户端必须等待 30 秒才能给出超时。更准确地说,线程在“GetLogicStatusListResponse result = ddcdao.GetLogicStatusList();”行停止执行。
如果单击程序上的按钮,我希望用户能够取消操作,但据我所知,没有办法中止 backgroundworker 并且取消不会真正帮助我,因为线程被锁定在代码甚至可以检查 cancelpending 是否为真之前 30 秒。
我想听听一些正确实施取消功能的想法,以便用户可以随时启动/停止连接。
private void bwWorkerConnect_DoWork(object sender, DoWorkEventArgs e)
{
//Branch in only if the DDC returns a ping response
if (DDCGlobal.DDCPingTest(ddc))
{
try
{
//Creates an object of class which communicates with the engine
//Retrieves the object obtained through remoting (Engine)
//and casts it to a ReqDDCLogicListResponse type (See CommonEngine)
DDCDAO ddcdao = new DDCDAO(DDCGlobal.ddcEngineIP, ddc.Ip);
//Request status list from DDC (TIMEOUT = 30 SECONDS)
GetLogicStatusListResponse result = ddcdao.GetLogicStatusList();
...
if (bwWorkerConnect.CancellationPending)
{
e.Cancel = true;
}
public void LogicListLoad()
{
if (!bwWorkerConnect.IsBusy)
bwWorkerConnect.RunWorkerAsync();
else
{
MessageBox.Show(UIConstant.DDC_CONNECT_ALREADY_WARNING);
}
}