我试图围绕线程如何工作,我相信我可能会过于复杂.
原始理解:
以前我认为线程仅限于单个类及其子类,没有类可以跨线程共享,线程之间的通信使我很难理解.
新理解:
但是我读的越多,它就好像线程只是在同一个代码中的随机点运行.您可以将其限制在某些区域,但理论上相同的代码可以在每个线程中运行多次.
换句话说,如果您将代码看作是具有转弯和连接的道路系统,那么这些是程序可以创建的流程,主线程就是通过它来运行的.如果产生了一个新线程,你所做的就是说它应该从哪里开始,代码从那里开始,可以使用相同的类和命令,所以如果你构造代码"坏",则存在两段代码的风险"崩溃",但旁边没有限制阅读和写入代码,它是同一个程序的所有部分,只是"道路"上的多个"汽车".
你可以限制一个线程停留在某个区域(循环/有限的代码部分),并且只在某些地方进行交互,或者你可以忽略它,只是希望避免"崩溃".
随着"新理解"与线程一起工作对我来说更容易包裹我的头脑,所以它是否被理解为正确?
TLDR; 版本的主要问题:
使用线程时,使用1个线程读取列表的内容是安全的,而另一个写入它,只要您不删除列表内容(reoganize order)并且只在新对象完全添加后读取新对象
当一个线程将Int从"旧值"更新为"新值"时,是否存在风险,如果另一个线程读取此Int,则返回的值既不是"旧值"也不是"新值"
一个线程是否有可能在忙碌时"跳过"一个关键区域,而不是只是进入睡眠状态并等待区域释放?
我有2段代码在单独的线程中运行,我想让一个代码作为另一个的生产者.我不希望任何一个线程在等待访问时"休眠",而是在其他线程正在访问它时在其内部代码中跳过.
我最初的计划是通过这种方法共享数据(一旦计数器足够高,切换到辅助列表以避免溢出).
我原来想要的伪流程代码.
Producer
{
Int counterProducer;
bufferedObject newlyProducedObject;
List <buffered_Object> objectsProducer;
while(true)
{
<Do stuff until a new product is created and added to newlyProducedObject>;
objectsProducer.add(newlyProducedObject_Object);
counterProducer++
}
}
Consumer
{
Int counterConsumer;
Producer objectProducer; (contains reference to Producer class)
List <buffered_Object> personalQueue
while(true)
<Do useful work, such as working on personal queue, and polish nails if no personal queue>
//get all outstanding requests and move to personal queue
while (counterConsumer < objectProducer.GetcounterProducer()) …Run Code Online (Sandbox Code Playgroud) 我试图让我的程序激活它的任务,如果在任何地方按下一个键,即使它没有在焦点.(让我们在这个例子中使用F1,并将任务设置为标签上的文本为"Hello World").
我查看了关键的监听器,挂钩等,并且正在努力了解正在发生的事情.有没有简单的方法来完成这项工作.
我正在尝试为我正在创建的类创建一个设置,因此在创建它时可以为它设置管理器类,并且可能需要通过接口调用该类中的函数
这些调用并不总是必需的,并且管理器可能并不总是调用此类的类,因此一个简单的返回值并使用它来形成管理器类不符合要求.
我想要做的是遵循代码.(试图剥离尽可能多的不必要的东西)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
interface Itester
{
void LoadTest();
}
public partial class Form1 : Form, Itester
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
World testWorld = new World();
testWorld.SetManager(this);
testWorld.InitializeWorld();
}
void Itester.LoadTest()
{
//random action I want run
label1.Text = "Ran LoadTest()";
}
}
public class …Run Code Online (Sandbox Code Playgroud)