用C#显式杀死线程

时间:2016-03-25 14:24:32

标签: c# multithreading

我有调用SAP BAPI的C#代码,但有时需要很长时间才能获得回复。

我只能等待3秒才能得到回复。如果它在3秒内没有返回,那么我想终止呼叫并继续下一行。

funcArtike2.SetValue("CLI", CLI);             
funcArtike2.Invoke(rfcDest);

string CA = funcArtike2["CONTRACT_ACCOUNT"].GetValue().ToString().Trim() != "".ToString() ? funcArtike2["CONTRACT_ACCOUNT"].GetValue().ToString().Trim() : "X";
//IRfcStructure RETURN = funcArtike2["RETURN"].GetStructure();
string BP = funcArtike2["BUSINESS_PARTNER"].ToString().Substring(funcArtike2["BUSINESS_PARTNER"].ToString().IndexOf("=")+1);

funcArtike2.Invoke(rfcDest);是我想在等待3秒后跳过的声明。

2 个答案:

答案 0 :(得分:5)

试试这个:

AutoResetEvent signal = new AutoResetEvent(false);
Timer timer = new Timer(3000);
timer.Elapsed += (sender, e) => signal.Set();        

funcArtike2.SetValue("CLI", CLI);

Thread thread = new Thread(()=>{
            funcArtike2.Invoke(rfcDest);
            signal.Set();
        });

thread.Start(); //start the function thread
timer.Start(); //start the timer

signal.WaitOne(); //waits for either the timer to elapse or the task to complete

string CA = funcArtike2["CONTRACT_ACCOUNT"].GetValue().ToString().Trim() != "".ToString() ? funcArtike2["CONTRACT_ACCOUNT"].GetValue().ToString().Trim() : "X";
            //IRfcStructure RETURN = funcArtike2["RETURN"].GetStructure();
string BP = funcArtike2["BUSINESS_PARTNER"].ToString().Substring(funcArtike2["BUSINESS_PARTNER"].ToString().IndexOf("=")+1);

我们假设通话:

funcArtike2.Invoke(rfcDest);

是同步的,否则无效。

另请注意,这不会杀死funcArtike2.Invoke(rfcDest)方法调用,只需忽略它并继续。因此,如果您开始任何昂贵的操作(例如数据库调用,文件,IO,繁重的计算),运气不好,因为您需要自己处理。

答案 1 :(得分:-1)

var response = expectedResponse;
var timer = System.Diagnostics.Stopwatch.StartNew();
while(timer.ElapsedMilliseconds < 3001)
{
     //Evaluate to see if you have received the response.
     if(response != null) { funcArtike2.Invoke(rfcDest); break; }
     if(timer.ElapsedMilliseconds == 3000) { throw new TimeoutException("Response was not received within three seconds."); 
}
// Handle the exception down here.

如果您不需要响应来继续工作,那么请删除该异常并让您的代码继续循环。