小编TX_*_*TX_的帖子

在C#中"返回等待"的目的是什么?

没有像这样编写方法的场景:

public async Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return await DoAnotherThingAsync();
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

public Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return DoAnotherThingAsync();
}
Run Code Online (Sandbox Code Playgroud)

会有意义吗?

为什么return await在可以直接Task<T>从内部DoAnotherThingAsync()调用返回时使用构造?

return await在很多地方看到代码,我想我应该错过一些东西.但据我了解,在这种情况下不使用async/await关键字并直接返回Task将在功能上等效.为什么要增加附加await层的额外开销?

.net c# async-await .net-4.5

219
推荐指数
7
解决办法
3万
查看次数

实现C++异常链的正确/优雅方式?

我想在C++中实现一个Exception类,它模仿.NET框架中的一个(并且Java也有类似的东西),用于以下目的:

  1. 异常链接:我想实现"异常转换"的概念,当在较高级别捕获的异常包装并"翻译"较低级别的异常时,也会以某种方式保留这些情人级异常(在此InnerException成员中,在此情况下) .为此,应该有一些机制来存储内部异常以及在上层抛出的每个异常.InnerException成员在下面的实现中提供了这个.

  2. 例外的继承:应该有可能获得IoExceptionException,并SerialPortExceptionIoException,例如.虽然这看起来微不足道,但应该能够动态识别捕获的异常类型(例如,用于记录目的,或显示给用户),最好没有RTTI的开销typeid.

这是我想要的示例异常处理逻辑:

try
{
    try
    {
        try
        {
            throw ThirdException(L"this should be ThirdException");
        }
        catch(Exception &ex)
        {
            throw SubException(L"this should be SubException", ex);
        }
    }
    catch(Exception &ex)
    {
        throw SubException(L"this should be SubException again", ex);
    }
}
catch(Exception &ex)
{
    throw Exception(L"and this should be Exception", ex);
}
Run Code Online (Sandbox Code Playgroud)

当在最上层中捕获"最外层"异常时,我希望能够通过InnerException成员解析和格式化整个异常链,以显示如下内容:

异常链格式化

到目前为止,我已经提出了以下实现:

小记:CString是特定于Microsoft的字符串类(仅适用于不熟悉Visual C++的人).

class Exception
{
protected:

    Exception(const Exception&) {}; …
Run Code Online (Sandbox Code Playgroud)

c++

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

Visual Studio 2012的增强型滚动条?

如果您有使用VS2010的生产力工具的增强型滚动条的经验,您知道如果没有它,几乎不可能工作.Visual Studio 2012不支持它.我用谷歌搜索但没有发现任何有趣的东西.也许你听说过一些与Visual Studio 2012一起使用的替代方案?

c# visual-studio visual-studio-2012

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

如何将visual studio 2010 SP1解决方案转换为visual studio 2012解决方案?

我知道他们(大多数项目类型)在2010 SP1和2012之间是相互兼容的,并且没有必要进行转换,但如果我还需要它呢?如果我需要将我的解决方案标记为Visual Studio 2012解决方案,该怎么办?当双击VS2010解决方案时,版本选择器会自动使用VS2010打开它(即使我现在安装了VS2012),图标上也有一个数字10(而不是数字11).

怎么做??.

c# visual-studio visual-studio-2012

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

动态COM对象是否被视为托管资源?

我有一个dynamicCOM对象作为我班级的私人领域.我不确定它是否被视为托管资源(GC清理它).

private dynamic _comConnector = null;
Run Code Online (Sandbox Code Playgroud)

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
Run Code Online (Sandbox Code Playgroud)

在实现IDispose时,我应该将其清理为托管资源(仅在显式调用Dispose()时),还是作为本机资源(从终结器调用Dispose(false)时)?

private void Dispose(bool disposing)
{
    if (disposing)
    {
        // Free managed resources //

        // --> Should I call Marshal.FinalReleaseComObject(_comConnector) here?
    }

    // Free unmanaged resources //

    // --> Or maybe here?
}
Run Code Online (Sandbox Code Playgroud)

c# com idisposable c#-4.0

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

从密码字符串派生加密密钥和IV时,可以使用密码的SHA1哈希作为盐吗?

我正在使用Rfc2898DeriveBytes从用户提供的字符串密码安全地生成加密密钥和初始化向量,以使用对称加密(例如AesManaged).

我将密码的SHA1哈希值作为salt参数Rfc2898DeriveBytes.这可以吗?如果没有,那么我应该从哪里获取盐?解密时我需要相同的盐,对吧?所以我必须将它存储在未加密的地方 - 不安全.如果我必须安全地存储它,那它就变成另一个"密码",不是吗?

void SecureDeriveKeyAndIvFromPassword(string password, int iterations, 
    int keySize, int ivSize, out byte[] key, out byte[] iv)
{
    // Generate the salt from password:

    byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password));

    // Derive key and IV bytes from password:

    Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations);

    key = derivedBytes.GetBytes(keySize);
    iv = derivedBytes.GetBytes(ivSize);
}
Run Code Online (Sandbox Code Playgroud)

我已经看到使用恒定(硬编码)盐,我看到人们抱怨它.我认为从密码中获取盐会更好,但我不确定这是一个最佳解决方案.

不久,我有一个需要加密的文件,以及用户输入的密码字符串.如何正确使用Rfc2898DeriveBytes导出安全加密密钥和IV?

谢谢.

编辑:

谢谢你的回答.我现在明白,盐的主要(也许只是?)目的是使彩虹表的生成变得不可能 - 你不能预先生成"P @ $$ w0rd"的散列,因为它对每种可能都有不同的散列盐值.我完全理解这一点,但是......这与对称加密真的相关吗?我不是把哈希存放在任何地方吗?因此,即使攻击者拥有所有可能的密码组合的彩虹表,他也做不了多少,对吧?

所以,我现在的问题是:与使用密码派生(或甚至硬编码)盐相比,在使用对称加密算法(如AesManaged of .NET),在每次加密操作中使用随机盐是否有任何优势?

.net c# security encryption cryptography

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

当用户绘制的控件大小增加时,新区域不会重新绘制

我想我在这里缺少一些微不足道的东西.我直接从中导出了简单的控件Control.我正在覆盖OnPaint并绘制矩形(e.Graphics.DrawRectangle)和其中的文本(e.Graphics.DrawString).我没有覆盖任何其他成员.

当控件调整到较小的尺寸时,它会很好地自我绘制,但是当它被调整到更大的尺寸时,新区域不会被正确重新绘制.一旦我再次将其调整为较小的尺寸,即使按一个像素,一切都正确重新绘制.

OnPaint被正确调用(正确PaintEventArgs.ClipRectangle设置到新区域),但无论如何都不会绘制新区域(出现工件).

我错过了什么?

编辑:

码:

protected override void OnPaint(PaintEventArgs e)
{
    // Adjust control's height based on current width, to fit current text:

    base.Height = _GetFittingHeight(e.Graphics, base.Width);

    // Draw frame (if available):

    if (FrameThickness != 0)
    {
        e.Graphics.DrawRectangle(new Pen(FrameColor, FrameThickness),
            FrameThickness / 2, FrameThickness / 2, base.Width - FrameThickness, base.Height - FrameThickness);
    }

    // Draw string:

    e.Graphics.DrawString(base.Text, base.Font, new SolidBrush(base.ForeColor), new RectangleF(0, 0, base.Width, base.Height));
}

private int …
Run Code Online (Sandbox Code Playgroud)

.net c# drawing winforms

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

使用TCP时,是否需要使用校验和来保护我的消息?

使用TCP作为网络协议,在通过网络发送消息之前,我为每条消息的大小(以及可能的校验和?)加前缀.我想知道,计算和传输消息的校验和是否有意义,以确保消息将被传送(如果和何时传送)不变,例如由于某些网络错误.目前,我在发送消息之前发送消息的4字节大小+ 2字节校验和(CRC-16).另一个端点正确识别预期的消息长度,读取它并验证校验和.

我知道TCP有内部数据包验证机制,我有一种强烈的感觉,我在应用程序级别的消息验证是多余的,但我不确定,在做出决定之前需要你的建议.

我正在开发客户端 - 服务器应用程序,每天有数万个与服务器的潜在连接.即使任何消息中的单个损坏字节也可能导致交换不正确消息的整个链,这是不可接受的(好吧,几乎所有客户端 - 服务器应用程序都有相同的要求,不是它们).所以我想确定 - 我能安全地信任TCP的内部可靠性,还是提供自己的校验和验证机制更好.我说的是小的,两个字节的校验和(CRC-16),我不是在谈论数字签名消息等等(并且系统是使用套接字在.Net(C#)中开发的,如果这有任何区别的话) .

.net c# sockets networking tcp

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

立方贝塞尔曲线是否完全由其控制点的边界框包含?

可能非常简单的问题(我只是想确保我是对的).标题不是100%正确,但以下是我需要的:

我想计算三次贝塞尔曲线的边界框(矩形).我知道包含曲线控制点的矩形不是字面上的边界框,它最可能更大,但我想确保它不能更小,也就是说,它总是包含曲线.

我有由多个连续的三次贝塞尔曲线定义的样条曲线,我想要它的边界框,或者最接近它的东西(我不是用于计算它的复杂公式,但是如果有一些不太复杂的话编码的方式,我很高兴知道).

澄清:"包含曲线控制点的矩形"是指像这样计算的矩形:我将控制点的最小X和最小Y坐标作为矩形的左上角,控制点的最大X和最大Y坐标作为矩形的较低 - 右上角.(Y轴从上到下).然后我想确保曲线肯定位于这个矩形内.

希望你明白我的意思:)

c++ math geometry

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

GDI:如何用颜色填充RoundRect?

虽然问题标题看起来很愚蠢,但这并不是我所需要的。为了用颜色填充整个区域,需要选择合适的画笔 - 这很简单。但我想用不同的颜色填充它的上半部分,用不同的颜色填充它的下半部分。如果它是普通(非圆形)矩形,我可以绘制两个矩形(使用不同的画笔)。但对于 RoundRect 我不知道如何做到这一点。

这就是我需要它的用途:我使用 RoundRect 绘制图形可视化中的每个节点,这些节点应该有几个应填充不同颜色的隔间(单元格)。

我希望你明白我的意思:)

gdi visual-c++

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

如何使公共属性线程安全?

BackgroundWorker出于某种原因正在实施替换,我必须实现以下公共属性:

public bool CancellationPending { get; private set; }
public bool IsBusy { get; private set; }
public bool WorkerReportsProgress { get; set; }
public bool WorkerSupportsCancellation { get; set; }
Run Code Online (Sandbox Code Playgroud)

我相信你知道他们服务的目的是什么BackgroundWorker.所以它们可能被不同的线程访问/修改.我担心如何为多线程"保护"它们.我认为声明它们volatile就足够了,但volatile不能应用于自动属性.

我该怎么办?我应该为这些属性创建私有字段,并声明它们volatile吗?或者我lock应该在每个内部使用getset阻止?

我认为这应该是非常常见的情况 - 使属性(最好是自动属性)线程安全.请注意,在此示例中,所有属性都是原子类型.

编辑:

澄清我需要的东西:我需要确保所有线程始终读取属性的最新值.请参阅:https://stackoverflow.com/a/10797326/1081467

所以再一次,你建议使用volatile,或者lock其他什么吗?..当使用bool属性时,保证原子性,所以只留下第二个问题(读取最新值),那么如何正确地解决这个问题?当你拥有非原始类型的属性时呢?你把lockS IN每个getset块?

.net c# multithreading thread-safety

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

在下列情况下可以使用goto吗?

好的,世纪的问题:)

在你说或想什么之前,让我告诉你,我已经读过几个关于这个话题的类似问题,但是我没有找到解决问题的明确方法.我的案例是具体的,我认为是系统程序员的典型案例.

我经常遇到这种情况.我讨厌搞砸了,不知道为什么,可能是因为每个人都在大喊大叫它是坏事.但是直到现在我还没有找到更好的解决方案来解决我的特定场景,而我目前的做法可能比使用goto更难.

这是我的情况:我使用C++(Visual C++)进行Windows应用程序开发,而且我常常在我的例程中使用大量的API.假设以下情况:

int MyMemberFunction()
{
    // Some code... //

    if (!SomeApi())
    {
        // Cleanup code... //

        return -1;
    }

    // Some code... //

    if (!SomeOtherApi())
    {
        // Cleanup code... //

        return -2;
    }

    // Some more code... //

    if (!AnotherApi())
    {
        // Cleanup code... //

        return -3;
    }

    // More code here... //

    return 0; // Success
}
Run Code Online (Sandbox Code Playgroud)

因此,在每个Api之后我必须检查它是否成功,并且如果没有则中止我的功能.为此,我使用了大量的// Cleanup code... //,通常是重复的,然后是return声明.该功能执行10个任务(例如使用10个Apis),如果任务#6失败,我必须清理以前任务创建的资源.请注意,清理应该由函数本身完成,因此不能使用异常处理.另外,在这种情况下,我无法看到有多少谈论RAII可以帮助我.

我想到的唯一方法是使用goto从所有这些失败案例跳转到一个清理标签,放置在函数的末尾.

有没有更好的方法呢?在这种情况下使用goto会被认为是不好的做法吗?该怎么办?这种情况对我来说非常典型(对于像我这样的系统程序员,我相信).

PS:需要清理的资源属于不同类型.可能存在内存分配,需要关闭的各种系统对象句柄等.

更新:

我认为人们仍然没有得到我想要的东西(可能我解释得很糟糕).我认为伪代码应该足够了,但这是一个实际的例子:

  1. 我用CreateFile打开两个文件.如果此步骤失败:我必须清除已打开的文件句柄(如果有).我稍后会阅读一个文件的一部分并写入另一个文件.

  2. 我使用SetFilePointer将读指针放在第一个文件中.如果此步骤失败:我必须关闭上一步打开的句柄.

  3. 我使用GetFileSize来获取目标文件大小.如果api失败,或文件大小异常,我必须进行清理:与上一步相同.

  4. 我分配指定大小的缓冲区从第一个文件读取.如果内存分配失败,我必须再次关闭文件句柄.

  5. 我必须使用ReadFile从第一个文件中读取.如果失败,我必须:释放缓冲区内存,并关闭文件句柄.

  6. 我使用SetFilePointer将写指针放在第二个文件中.如果失败,则必须进行相同的清理. …

c++

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