gpt4 book ai didi

c# - 将异常或消息从线程/任务传递到主线程

转载 作者:行者123 更新时间:2023-12-03 13:17:50 27 4
gpt4 key购买 nike

我们正在处理Windows服务(.net 4.0)中大文件的处理和上传。处理和上传步骤可能需要几分钟才能完成。管理员可以直接在数据库中将作业标记为已取消,但要清除内存队列中的作业则需要重新启动服务。目标是放弃该作业并在不重新启动服务的情况下选择队列中的下一个作业。这是我想做的:

在主入口点,启动两个任务:

Task processTask = Task.Factory.StartNew(ProcessJob);

Task monitorTask = Task.Factory.StartNew(MonitorDB);

ProcessJob将调用多个长时间运行的步骤,例如ProcessFile,UploadFile。我们正在检查步骤之间的作业状态,但是作业可能卡在了这些长时间运行的步骤之一中。

如果MonitorTask在DB中检测到作业状态更改,则应(通过异常或消息)将其传达给主线程,以便主线程可以退出,将自身从处理队列中删除并允许队列中的下一个作业启动。如果不等待,则不能进入异常,但不能等待,因为需要并行运行这些任务。
目前,我们不担心ProcessJob中的某些同步步骤可能仍在进行并且最终可能完成的事实。我们将用代码来处理。

到目前为止,在我所有的应用程序中,我都使用Task.ContinueWith进行成功和失败,但从未必须与主线程进行通信。

最佳答案

您可以通过BlockingCollection<T>在监视线程和主线程之间进行通信。

这是我写的一个简单示例。

BlockingCollection<string> queue =
new BlockingCollection<string>();

// monitor thread.
Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(1000);
queue.Add("event occured.");
}
});

// main thread.
while (true)
{
// blocks when no messages are in queue.
string message = queue.Take();

// kill process thread here.
}

关于c# - 将异常或消息从线程/任务传递到主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10819358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com