我需要監視一個任務,並在需要的時間超過一個定義的超時時間後終止它。操作超時TPL
到目前爲止,我有很多嘗試都是從創建線程和發出線程中止等開始的。然後,我決定使用TPL。
您必須假定WorkItem是黑盒子。您無權訪問其源代碼。所以,重寫它讓它跟蹤令牌是不現實的。這需要從外面控制。
任何想法?
public class WorkItem : IDisposable
{
private System.Diagnostics.Stopwatch _watch = new System.Diagnostics.Stopwatch();
private List<string> _messages = new List<string>();
public void WriteMessage(string message)
{
_messages.Add(message);
}
public void Run()
{
for (int i = 1; i <= 25; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Slept one second after {0} iteration.", i);
}
}
public void Dispose()
{
_watch.Stop();
Console.WriteLine("Disposed... lived for {0} milliseconds", _watch.ElapsedMilliseconds);
}
}
class Program
{
static void Main(string[] args)
{
int timeout = 5000;
WorkItem item = new WorkItem();
System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Factory.StartNew<WorkItem>((arg) =>
{
WorkItem currentWorkItem = arg as WorkItem;
currentWorkItem.Run();
return currentWorkItem;
}, item);
bool wait = task.Wait(timeout);
if (wait == false)
{
Console.WriteLine("It took more than {0} ms.", timeout);
// Need a way to kill the task.
}
Console.WriteLine("Okay Waiting");
Console.ReadKey();
}
}
無論你做什麼 - 不要「中止」線程。通過搜索找到許多失敗的人。 – usr
'WorkItem'是否有一個重載的[CancelationToken](http://msdn.microsoft.com/zh-cn/library/system.threading.cancellationtoken.aspx)?你說你不能重寫它來跟蹤一個標記,但你從來沒有說過它是否已經接受了一個標記。或者是否有其他內置的用於中斷'Run()'的接口? –
號碼 這是一個黑匣子。 – Sam