小编Oli*_*bes的帖子

BackgroundWorkers永远不会停止忙碌

for (do it a bunch of times)
{         
    while (backgroundWorker1.IsBusy && backgroundWorker2.IsBusy &&
           backgroundWorker3.IsBusy && backgroundWorker4.IsBusy &&
           backgroundWorker5.IsBusy)
    {
        System.Threading.Thread.Sleep(0001);
    }

    if (!backgroundWorker1.IsBusy)
    {
        backgroundWorker1.RunWorkerAsync();
    }
    else if (!backgroundWorker2.IsBusy)
    {
        backgroundWorker2.RunWorkerAsync();
    }
    else if (!backgroundWorker3.IsBusy)
    {
        backgroundWorker3.RunWorkerAsync();
    }
    else if (!backgroundWorker4.IsBusy)
    {
        backgroundWorker4.RunWorkerAsync();
    }
    else if (!backgroundWorker5.IsBusy)
    {
        backgroundWorker5.RunWorkerAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

它运行五次(每个BG工作一次)并且一直卡住.背景工作者不要再忙吗?我如何查看空房情况?

注意:有5个工作线程,这可以确保它们都不会停止,总是为它们分配工作.但他们拒绝告诉我什么时候可用,我认为这将有一个简单的解决方案..

- [编辑请求] ---

实际上它只是一个虚拟参数,我删除它并忘了把它拿出来,我只用它来调用dowork,谁做了脏工作:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    timeconsumingfunction(publicstring);
}
Run Code Online (Sandbox Code Playgroud)

时间消耗功能结束了.在调试器中逐步进入它并在每行运行一行,直到结束并到达最后的'}'.这意味着它结束了吧?

--- [编辑答案] ----它通过JUST替换线路

System.Threading.Thread.Sleep(0001);
Run Code Online (Sandbox Code Playgroud)

Application.DoEvents();
Run Code Online (Sandbox Code Playgroud)

我想它会运行后台,但没有收到答案,也没有更新IsBusy标签.

谢谢大家,很棒的答案,帮了很多忙!

.net c# multithreading backgroundworker visual-studio

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

背景工作者 - 报告与字符串数组的进展

我需要在每个循环中从我的backgroundworker返回多个STRING值,所以我尝试使用ReportProgress第二个参数作为字符串数组.代码示例:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string[] workerResult = new string[2];
    for (int i=0; i<someNumber; i++)
    {
        //do some heavy calculating
        workerResult[0] = "this string";
        workerResult[1] = "some other string";
        backgroundWorker1.ReportProgress(i, workerResult) // also tried workerResult[] and [2]
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    string[] results = (string[])e.UserState;

    MessageBox.Show(results[0]); // line of error
    MessageBox.Show(results[1]); // line of error
}
Run Code Online (Sandbox Code Playgroud)

它编译,但在运行时我尝试访问Userstate返回的字符串,我收到一个错误:"对象引用未设置为对象的实例."

对我来说,似乎在将数组参数传递给ProgressChanged委托时出错,或者在尝试设置结果数组值时使用ProgressChanged方法.

.net c# backgroundworker

9
推荐指数
2
解决办法
3万
查看次数

VB中的Func与函数

有人能告诉我在VB中Func和Function之间有什么区别.

例如,请参阅以下内容:

Dim F As Func(Of String) = Function() As String
                             Return "B"
                           End Function
Dim F2 = Function() As String
           Return "B"
         End Function
Run Code Online (Sandbox Code Playgroud)

F作为Func(Of String)F2显示为Function()作为字符串.

看起来他们做同样的事情,但鉴于编译器认为它们具有不同的类型,肯定必须存在一个副性.

最好的祝福

查尔斯

vb.net lambda

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

为什么[Flag]'枚举从0开始并递增1?

编辑:似乎大多数人误解了我的问题.

我知道枚举是如何运作的,我知道二进制.我想知道为什么带有[Flags]属性的枚举是按原样设计的.

原帖:

这可能是重复的,但我没有找到任何其他帖子,所以这里.

我打赌它背后有一些很好的理由,我发现它有点容易出错.

[Flag]
public enum Flagged
{
  One, // 0
  Two, // 1
  Three, // 2
  Four, // 3
}

Flagged f; // Defaults to Flagged.One = 0
f = Flagged.Four;
(f & Flagged.One) != 0; // Sure.. One defaults to 0
(f & Flagged.Two) != 0; // 3 & 1 == 1
(f & Flagged.Three) != 0; // 3 & 2 == 2
Run Code Online (Sandbox Code Playgroud)

如果做到这样的话会不会更有意义?

[Flag]
public enum Flagged
{
  One = 1 << 0, …
Run Code Online (Sandbox Code Playgroud)

c# enums bitflags

8
推荐指数
3
解决办法
2738
查看次数

确实存在构造函数参数不存在的例外情况

我试图通过使用Unity将基于接口的两个对象注入到类构造函数中.

单元测试时我当前收到以下错误:

结果消息:
测试方法TestProject.TFStests.Check_Interface_CheckOut_Method引发异常:System.InvalidOperationException:类型Adp.Tools.VersionControl.TfsVersionControl.TfsVcPromotionManager没有带参数的构造函数(TfsVcQaCheckoutWorker).

以下代码是我的Unity类,用于注册和解析TfsVCPromotionManager对象:

public class UnityClass
{
    public static ITfsVcPromotionManager returnNewPromotionManager(
       VersionControlServer tfServer)
    {
        var container = new UnityContainer();

        ITfsVcQaCheckinWorker test1 = CreateUnityCheckInWorker();
        ITfsVcQaCheckoutWorker test2 = CreateUnityCheckOutWorker(tfServer);

        container.RegisterType<ITfsVcPromotionManager, TfsVcPromotionManager>(
            new InjectionConstructor(test2), new InjectionConstructor(test1));
        return container.Resolve<TfsVcPromotionManager>();
    }

    private static ITfsVcQaCheckinWorker CreateUnityCheckInWorker()
    {
        var container = new UnityContainer();

        container.RegisterType<ITfsVcQaCheckinWorker, ITfsVcQaCheckinWorker>();
        return container.Resolve<TfsVcQaCheckinWorker>();
    }

    private static ITfsVcQaCheckoutWorker CreateUnityCheckOutWorker(
        VersionControlServer passedServer)
    {
        var container = new UnityContainer();

        container.RegisterType<ITfsVcQaCheckoutWorker, TfsVcQaCheckoutWorker>(
            new InjectionConstructor(passedServer));
        return container.Resolve<TfsVcQaCheckoutWorker>();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是TfsVcPromotionManager班上的顾问.请注意,它清楚地基于接口的实例需要ITfsVcQaCheckoutworker和 …

c# integration-testing constructor exception unity-container

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

XNA/Mono效果投掷运行时强制转换异常

作为前言,完全相同的代码在XNA中工作得很好,但是Monogame会引发异常.这可能需要熟悉Monogame渲染管道的人.

在我的游戏的Draw部分中,有一个ShadowmapResolver渲染出一个纹理,它是给定光源的最终计算光模式.从什么本质上呈现时,它的接收异常EffectPass.Apply()抱怨从某处内单从那里有一个尝试投int32[]Single[].这是我的代码调用它:

private void ExecuteTechnique(Texture2D source, RenderTarget2D destination,
                              string techniqueName, Texture2D shadowMap)
{
    graphicsDevice.SetRenderTarget(destination);
    graphicsDevice.Clear(Color.Transparent);

    resolveShadowsEffect.Parameters["renderTargetSizeX"].SetValue((float)baseSizeX);
    resolveShadowsEffect.Parameters["renderTargetSizeY"].SetValue((float)baseSizeY);

    if (source != null)
        resolveShadowsEffect.Parameters["InputTexture"].SetValue(source);
    if (shadowMap != null)
        resolveShadowsEffect.Parameters["ShadowMapTexture"].SetValue(shadowMap);

    resolveShadowsEffect.CurrentTechnique = resolveShadowsEffect
        .Techniques[techniqueName];

    try
    {
        foreach (EffectPass pass in resolveShadowsEffect.CurrentTechnique.Passes)
        {
            pass.Apply(); // <--- InvalidCastException re-enters my program here
            quadRender.Render(Vector2.One * -1, Vector2.One);
        }
    }
    catch (Exception ex)
    {
        Util.Log(LogManager.LogLevel.Critical, ex.Message);
    }
    graphicsDevice.SetRenderTarget(null);
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

at Microsoft.Xna.Framework.Graphics.ConstantBuffer.SetData(Int32 offset, Int32 rows, Int32 columns, Object data)
   at Microsoft.Xna.Framework.Graphics.ConstantBuffer.SetParameter(Int32 …
Run Code Online (Sandbox Code Playgroud)

c# xna monogame

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

Lambda捕获参数引发歧义

我只是碰到了一个非常奇怪的C#行为,如果有人能向我解释,我会很高兴.

说,我有以下课程:

class Program
{
    static int len = 1;
    static void Main(string[] args)
    {
        Func<double, double> call = len => 1;
        len = 1; // error: 'len' conflicts with the declaration 'csutils.Program.len'
        Program.len = 1; // ok
    }
}
Run Code Online (Sandbox Code Playgroud)

当我得到它时,在评论的路线中,我在我的视野中有以下物体:len变量和call.在lambda里面,我有本地参数lenProgram.len变量.

然而,在声明这样的lambda之后,我不能再lenMain方法范围内使用变量了.我必须要么将它Program.len重写为lambda anyOtherNameBesidesLen => 1.

为什么会这样?这是语言的正确行为,还是我遇到了语言中的错误?如果这是正确的行为,语言架构如何证明它是正确的?为什么lambda捕获变量可以搞乱lambda之外的代码?

编辑:亚历山德罗·德安德里亚有很好的例子(他的评论中的第1和第2).

edit2:这段代码(等于我在开头写的那段)是非法的:

class Program
{
    static int len = 0;
    static void Main(string[] args)
    {
        {
            int len = …
Run Code Online (Sandbox Code Playgroud)

c# lambda

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

如何修复 C# 源生成器未找到引用的问题

我有一个使用 C# 源生成器的项目。

https://github.com/efonsecab/PTIMicroservicesGenerators

我遇到的问题是编译控制台应用程序时遇到此问题

CSC:警告 CS8785:生成器“OpenApiClientServicesGenerator”无法生成源。它不会对输出产生影响,因此可能会出现编译错误。异常的类型为“FileNotFoundException”,消息为“无法加载文件或程序集“Microsoft.OpenApi.Readers,Version=1.2.3.0,Culture=neutral,PublicKeyToken=3f5743946376f042”或其依赖项之一。该系统找不到指定的文件。'

有谁知道使用 C# 源生成器时解决此问题的正确方法是什么?谢谢您的帮助。

.net c# roslyn .net-core .net-5

7
推荐指数
2
解决办法
6348
查看次数

数据库属性可以是主键还是外键?

我有2张桌子,UserEmployee.每个用户都被赋予一个User_ID,这是User表中的主键和表中的外键Employee.Employee表中的该属性也可以是主键吗?

database foreign-keys primary-key relational-database

6
推荐指数
1
解决办法
2万
查看次数

Type.GetProperties什么都不返回

请考虑以下代码:

public class MyClass
{
    public MyClass(Type optionsClassType)
    {
      //A PropertyInfo[0] is returned here
      var test1 = optionsClassType.GetProperties();
      //Even using typeof
      var test2 = typeof(MyClassOptions).GetProperties();
     //Or BindingFlags
      var test3 = typeof(MyClassOptions)
          .GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public);
    }
}

public class MyClassOptions
{
    public int MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我无法获得PropertyInfo[]MyClassOptions,Type.GetProperties总是返回一个空数组.首先我认为这是Xamarin.iOS中的一个框架错误,但是我在另一个针对相同框架的项目中测试了相同的代码并且它工作得很好.

有人知道可能的原因吗?

编辑

感谢@Fabian Bigler回答我得到了它.在我的项目中,即使Linker设置为适度的行为,实例化MyClassOptions也不足以在运行时保持类定义.只有在实际使用实例后(例如设置属性),类才会保留在我的构建中.

似乎链接器用假人替换"未使用"的东西.由于我将在这个项目中大量使用反射,我刚刚禁用了链接器,一切都恢复正常.

c# reflection linker xamarin.ios

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