小编Tao*_*aoh的帖子

试图绕过线程

我试图围绕线程如何工作,我相信我可能会过于复杂.

原始理解:

以前我认为线程仅限于单个类及其子类,没有类可以跨线程共享,线程之间的通信使我很难理解.

新理解:

但是我读的越多,它就好像线程只是在同一个代码中的随机点运行.您可以将其限制在某些区域,但理论上相同的代码可以在每个线程中运行多次.

换句话说,如果您将代码看作是具有转弯和连接的道路系统,那么这些是程序可以创建的流程,主线程就是通过它来运行的.如果产生了一个新线程,你所做的就是说它应该从哪里开始,代码从那里开始,可以使用相同的类和命令,所以如果你构造代码"坏",则存在两段代码的风险"崩溃",但旁边没有限制阅读和写入代码,它是同一个程序的所有部分,只是"道路"上的多个"汽车".

你可以限制一个线程停留在某个区域(循环/有限的代码部分),并且只在某些地方进行交互,或者你可以忽略它,只是希望避免"崩溃".


随着"新理解"与线程一起工作对我来说更容易包裹我的头脑,所以它是否被理解为正确?

c# multithreading

9
推荐指数
1
解决办法
171
查看次数

C#线程无需锁定生产者或消费者

TLDR; 版本的主要问题:

  1. 使用线程时,使用1个线程读取列表的内容是安全的,而另一个写入它,只要您不删除列表内容(reoganize order)并且只在新对象完全添加后读取新对象

  2. 当一个线程将Int从"旧值"更新为"新值"时,是否存在风险,如果另一个线程读取此Int,则返回的值既不是"旧值"也不是"新值"

  3. 一个线程是否有可能在忙碌时"跳过"一个关键区域,而不是只是进入睡眠状态并等待区域释放?

我有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)

c# multithreading

4
推荐指数
1
解决办法
698
查看次数

在按键上激活一个未聚焦的C#程序(例如,F1将标签设置为"Hello World")

我试图让我的程序激活它的任务,如果在任何地方按下一个键,即使它没有在焦点.(让我们在这个例子中使用F1,并将任务设置为标签上的文本为"Hello World").

我查看了关键的监听器,挂钩等,并且正在努力了解正在发生的事情.有没有简单的方法来完成这项工作.

c# key listener

3
推荐指数
1
解决办法
2510
查看次数

在C#中使用接口的问题

我正在尝试为我正在创建的类创建一个设置,因此在创建它时可以为它设置管理器类,并且可能需要通过接口调用该类中的函数

这些调用并不总是必需的,并且管理器可能并不总是调用此类的类,因此一个简单的返回值并使用它来形成管理器类不符合要求.

我想要做的是遵循代码.(试图剥离尽可能多的不必要的东西)

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)

c# interface

1
推荐指数
1
解决办法
153
查看次数

标签 统计

c# ×4

multithreading ×2

interface ×1

key ×1

listener ×1