是否有一种优雅的方式来了解工作线程何时完成执行,以便我可以访问它生成的资源?
例如,如果工作线程使用查询SQL Server列表
ServersSqlDataSourceEnumerator.Instance.GetDataSources();
并将结果保存在DataTable变量中,我可以使用什么机制来了解此DataTable变量何时已填充/可用.我不想轮询ThreadState; 当事件完成时触发事件是理想的,这样我就可以对结果执行操作.
谢谢!
在调试.NET Framework 3.5,WinForms应用程序时,我发现了一些没有名称的"工作线程".
我知道当你打开一个应用程序时,默认情况下你有一个工作线程.但是在调试过程中,当我暂停调试器并查看"线程"窗口时,我看到大约5个以上类似的线程(优先级=正常).
应用程序打开的所有线程都有一个名称,所以这些不是从代码中打开的,至少不是通过Thread.Start()
当我尝试双击时,VS.NET也找不到代码.
这些线程是什么?它们是正常的,还是某些操作会以某种方式留下空线?
它们可以是定时器或类似的非显而易见的控件,函数可以在后台使用临时线程吗?
Error [ERR_WORKER_OUT_OF_MEMORY]: worker terminated due to reaching memory limit当我尝试在资源受限的 Windows 环境中运行 nodejs 工作线程时,我收到错误消息。
谢谢。
假设我有nodejs serverProgram一个 api,它对通过 http 请求发送的视频文件进行了一些操作。
const saveVideoFile=(req,res)=>{
processAndSaveVideoFile(); // can run for minimum of 10 minutes
res.send({status: "video is being processed"})
}
Run Code Online (Sandbox Code Playgroud)
我决定使用 aworkerThread来做这个处理,因为我的机器有 3 个内核(core1、core2、core3)并且这里没有启用超线程
假设我的 nodejs 程序在core1. 当我火了一个单一的WorkerThread,将在运行的WorkerThreadcore2/core3还是core1?
我读到 workerThread 与 childProcess 不同。ChildProcess 将派生一个新进程,这将有助于 childProcess 从可用的免费内核(core2 或 core3)中进行选择。
我读到 workerThread 与 mainThread 共享内存。假设我创建了 2 个 workerThreads (wt1,wt2)。我的 nodejs 程序 wt1、wt2 会在同一个核心上运行core1吗?
此外,在 nodejs 中,我们有 eventloop(主线程)和 otherThreads 执行后台操作,即 I/O。假设所有这些都在利用单个内核 (core1) 中可用的资源是否正确。如果是这种情况,是否在 nodejs 服务器上创建和使用额外的 workerThread 是一种矫枉过正?
下面是这个博客 …
我想使用将数据插入 mongoDBworker thread
现在我有一个工作文件,工作文件的全部目的是将数据保存到 mongoDB 中,mainjs 正在发送我想要保存到 mongoDB 中的代理的名称
工人.js
const { workerData, parentPort } = require('worker_threads')
const Agent = require('../models/agent')
console.log("Worker thread is running like a hell: ", workerData)
const processRecord = async () => {
const agent = new Agent({agent:workerData})
try {
await agent.save()
}catch(e) {
console.log(e)
}
}
processRecord();
Run Code Online (Sandbox Code Playgroud)
main.js
const express = require('express')
const router = new express.Router()
const { Worker } = require('worker_threads')
router.post('/agent', async (req, res) => {
function runService(workerData) {
return new …Run Code Online (Sandbox Code Playgroud) 使用Spring的集成API Quartz,对具有未捕获异常的cron作业有什么影响?由于cronbean/worker线程没有捕获异常,这是否意味着该线程已经死亡并且无法返回到SimpleThreadPool?如果它死了并且没有返回池将意味着SimpleThreadPool将需要创建新线程,如果这样多次发生,从而清空池?
这是堆栈跟踪的示例:
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:276) - Invocation of method 'doCronJob' on target class [abc.package.ServiceImpl] failed
java.io.FileNotFoundException: http://www.website.com
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1457)
at abc.package.ServiceImpl.doCronJob(ServiceImpl.java:453)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:283)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:272)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86)
at org.quartz.core.JobRunShell.run(JobRunShell.java:208)
**at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:520)**
Run Code Online (Sandbox Code Playgroud) 普通工作线程在循环中运行,在该循环中,它检查队列中的可用任务并使用它们.我似乎有一些例子,例如,当没有可用的任务时,线程会等待几毫秒std::this_thread::sleep_for().但是,我希望我的线程以最小的延迟消耗任务,因此我不使用睡眠.这有什么不好吗?在检查任务时,工作线程应该睡眠几毫秒吗?
最近,我一直在进行类型绑定的测试,该绑定实现INotifyPropertyChanged了工作线程抛出跨线程问题并更新了属性。
这是示例代码:
public class MyViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler hanlder = PropertyChanged;
if(hanlder != null)
hanlder(this, new PropertyChangedEventArgs(propertyName));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的viewmodel已与Windows窗体中的标签文本绑定,并从工作线程更新标签值。
从辅助线程更新label1文本会导致跨线程问题:
public partial class MainForm : Form
{
private MyViewModel _myViewModel = new MyViewModel();
public MainForm()
{
InitializeComponent();
Btn1.Click += Btn1_Click; …Run Code Online (Sandbox Code Playgroud)