小编Vin*_*ent的帖子

我们应该如何使用异步等待?

我一直在研究如何使用异步等待,但是当我们有多个互相调用的方法时,我不太了解它。我们应该始终使用等待还是仅在实际准备好使用结果时才使用等待?

因此,例如,我们应该这样做吗:

async Task<string[]> FooAsync()
{
    var info = await Func1();
    return info.split('.');
}

async Task<string> Func1()
{
    return await Func2();
}

async Task<string> Func2()
{
    return await tcpClient.ReadStringAsync();
}
Run Code Online (Sandbox Code Playgroud)

或像这样:

async Task<string[]> FooAsync()
{
    var info = await Func1();
    return info.split('.');
}

Task<string> Func1()
{
    return Func2();
}

Task<string> Func2()
{
    return tcpClient.ReadStringAsync();
}
Run Code Online (Sandbox Code Playgroud)

根据示例1,我们应该在每种方法中始终使用await吗?
还是
按照示例2,当我们开始使用结果时,我们应该只在最上面的方法上使用await吗?

c# asynchronous async-await

40
推荐指数
2
解决办法
3085
查看次数

在特定断点处断开时,Debugger :: HandleIPCEvent中的visual Unhandled异常

我得到以下异常(在文本中以荷兰语,英语翻译),当我按下"确定"时它会中断我的调试器,它会停止调试会话并关闭应用程序:

在此输入图像描述

文字翻译:

---------------------------
LerTemperaturaWPF.vshost.exe - Application Error
---------------------------
INTERNAL ERROR:
Unhandled exception in Debugger::HandleIPCEvent.
Event ID=0x246.
Exception code=0xc0000005, Eip=0x68fbaeca.
Process ID=0x1094 (4244), Thread ID=0x10a4 (4260).
---------------------------
OK   
---------------------------
Run Code Online (Sandbox Code Playgroud)

如果调试器第一次中断在某段代码中,则会发生这种情况:

private void PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    // Set value of property, only when the long editor is selected (no optionlist item is selected)
    if (this.Editor.SelectedItem != null)
    {
        if (this.Editor.SelectedItem as OptionForList == null)
        {
            this.Editor.SelectedValue = ((Management.Property)this.Editor.SelectedItem).Value;
            this.Editor.SelectedIndex = 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我将断点放在第二个if语句中,在第二个if语句之前(我放置它的地方)时,会发生这种情况.它没有给我任何问题.

如果我确保调试器的第一次中断是在此代码之前,之后它在此代码中遇到断点,则也没有问题.在获取此代码之前,调试器必须已损坏.现在我不认为它与此代码有任何关系(90%确定).

更改的属性是用户控件,不知何故,我认为调试器无法正确处理用户控件?也许?

有谁见过这种行为,并知道如何解决这个问题?我是否需要关闭(或打开)某些调试设置?

c# debugging visual-studio-2015

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

在生产数据库上部署应用程序时无法加载文件或程序集'System.Data错误

问题: 将应用程序部署到生产数据库时,出现以下错误:

Could not load file or assembly 'System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.

   at ConsoleApplication2.Database.DBConnect.Initialize(String username, String password, String IP)
   at ConsoleApplication2.Database.DBConnect..ctor(String username, String password, String IP) in C:\Users\Vincent\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\DBConnect.cs:line 26
   at ConsoleApplication2.Database..ctor() in C:\Users\Vincent\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\Database.cs:line 20
   at ConsoleApplication2.Main..ctor() in C:\Users\Vincent\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\Main.cs:line 16
Run Code Online (Sandbox Code Playgroud)

我所知道的:实际上并不是System.Data.dll有问题.

因为我已经开始制作干净的控制台应用程序了.首先只使用Console.write().什么工作,我做了一个新的类,做了一些一般的计算(也没有问题)比我决定使用MySQL.data.MySqlClient创建一个MySQL连接; 来自Mysql.data.dll,这是再次发生错误.我从mysql站点获得了dll .

奇怪的是: 这个dll一直在我的计算机上(我在其上创建了应用程序)和两个不同的服务器上工作(其中一个我设置的只是用于测试这些应用程序,看看我是否会遇到同样的问题)

一些规格: 我的电脑运行Windows 7 32位.生产数据库运行Windows 2003 Service Pack 2,测试服务器和我尝试过的其他服务器也是如此.

我做过的其他一些事情: 我创建了一个安装程序(.msi和.exe),安装.net 3.5 service pack 1和.net …

c# mysql dll

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

在不知道字节数的情况下读取特殊流

在你去使用Jon Skeet的回答之前,我不能.我正在使用这个开头很棒的,但现在,我遇到了一个小问题.我现在处于一个我不知道我期望的数据量的地方,所以我认为我会使用Jon Skeet提供的方法但不幸的是它等待packet = mPackets.Take()所有数据包都已被读取.

我不知道如何解决这个问题,流做了它应该做的事情(在开始时),但不幸的是,这是一个我不希望它做它为...做的事情的场合.

我是否应该尝试重写waitingstream或者是否有一种不同的readall方法可以在我的情况下更好地工作?

我已经尝试在没有更多可用数据包的时候返回0(当我想要它全部读取而不是等待时)但是它会抛出一个IO end of stream exception.

我真的很茫然,我知道我为自己挖了一个深洞......

到目前为止,我还没有能够提出一个更好的解决方案,而不是从总长度中减去TLS标题和GCM IV和MAC(如下所述)这对于我现在使用的1套件工作正常,但不能很好地吹嘘用于未来的密码套件.


关于我为什么这样做的一些背景:
我使用https://github.com/bcgit/bc-csharp来创建基于TLS的加密,但是由于限制,我无法为其分配TCP流,所有我得到的是来自TCP层的字符串,我不能为它提供一个propper TCP流.

我正在使用mockPskTlsServer和客户端,我已经创建了它:

WaitingStream mStdin = new WaitingStream();
WaitingStream mStdout = new WaitingStream();
CryptoPskTlsClient mServer = new CryptoPskTlsClient(null);
SecureRandom secureRandom = new SecureRandom();
TlsClientProtocol TlsProtocol = new TlsServerProtocol(Stdin, Stdout, secureRandom);
TlsProtocol.Connect(mServer);
Run Code Online (Sandbox Code Playgroud)

这很好用,我还在等待流中添加了一个事件,当流的输出时会触发该事件.这样我就可以在创建它时获得多个握手消息.

这一切都运行良好,本来可以做得更好(少了......被黑了?)但它确实做了它应该做的事情.

我知道如何让它工作,但这是一个HACK,我正在寻找一种优雅的方式来做到这一点.以下是其中一个HACKS的代码示例:

public override string DecryptData(string ciphertext)
{
    byte[] ciphertextBuff = ASCIIEncoding.Default.GetBytes(ciphertext);
    mStdin.Write(ciphertextBuff, 0, …
Run Code Online (Sandbox Code Playgroud)

c# ssl bouncycastle stream

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

是否有并发排序字典或类似的东西?

对于我们一直在研究的一个项目,我们使用了一个并发字典,这很好,直到出现一个要求对字典进行排序的新规范(它应该保持添加的顺序,有点像 FIFO)。

这就是我们目前所做的,我们从字典中取出 x 项(在本例中为 5):

private Dictionary<PriorityOfMessage, ConcurrentDictionary<Guid, PriorityMessage>> mQueuedMessages = new Dictionary<PriorityOfMessage, ConcurrentDictionary<Guid, PriorityMessage>>();


var messages = new List<KeyValuePair<Guid, PriorityMessage>>();
messages.AddRange(mQueuedMessages[priority].Take(5));
Run Code Online (Sandbox Code Playgroud)

然后我们用它做一些事情,最终如果一切顺利,我们就删除了它们。

mQueuedMessages[priority].TryRemove(messageOfPriority.Key);
Run Code Online (Sandbox Code Playgroud)

但是,如果事情失败,我们不会删除它们并稍后再试。不幸的是,没有并发排序字典,但是有没有办法确保消息保持它们添加的顺序?

非常重要的是我们可以从列表/字典中获取多个对象而不删除它们(或者我们需要能够稍后将它们添加到前面)。

c# concurrency sorteddictionary

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

Guid.Tostring()在我的数据库中提供了与UUID_TO_CHAR不同的表示

我正在使用带有UUID的Firebird数据库作为主键但我遇到了以下问题:

我的C#应用​​程序中相同Guid的文本表示与数据库的不同.我正在使用UUID_TO_CHAR函数和我的C#应用​​程序中的数据库中获取文本表示Guid.ToString().

区别在于Firebird数据库解释UUID与.net框架的方式,我相信他们用不同的字节顺序读取它们

例如,数据库中的guid如下所示:

FADE3E40-6227-5B40-BBB9-8492859EBA66
Run Code Online (Sandbox Code Playgroud)

我的C#应用​​程序中的相同guid看起来像这样:

403edefa-2762-405b-bbb9-8492859eba66
Run Code Online (Sandbox Code Playgroud)

有没有办法在我的数据库中显示它们与在C#中显示的方式相同.或相反亦然?

有没有办法在从数据库中获取它们并将它们放入数据库时​​进行转换,因此我不必在任何地方使用格式?

c# firebird uuid guid firebird2.5

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

app.manifest 和 assemblyInfo.cs 版本号,是否需要 app.manifest?

我已经在 app.manifest 上做了很多阅读,但我不明白。好吧,我确实知道您在某些方面需要它,例如:<requestedExecutionLevel level="asInvoker" uiAccess="false" />我们确实需要和使用它。但也有这样的:

<assemblyIdentity
  name="ModuleSimulator"
  processorArchitecture="*"
  version="1.0.2.1"
  type="win32"/>
Run Code Online (Sandbox Code Playgroud)

我没有得到的部分来了,我可以不考虑任何后果,对吗?我们已经有一个 AssemblyInfo.cs,其中包含所有程序集详细信息,其中包括版本:

[assembly: AssemblyVersion("1.0.2.2")]
[assembly: AssemblyFileVersion("1.0.2.2")]
[assembly: AssemblyInformationalVersion("R165Fv001r02")]
[assembly: NeutralResourcesLanguageAttribute("en")]
Run Code Online (Sandbox Code Playgroud)

我们的目标是 Windows 7(目前),但我们将来也可能会开始支持 Windows 10。那么,如果 AssemblyInfo.cs 确保以正确的方式编译程序集,那么清单文件中的 assemblyIdentity 有什么用。

我确实意识到以前有人问过这个问题,但我似乎不明白。

我想我明白的是:windows 应用商店也使用 app.manifest .. 验证?应用程序。(当然,检查应用程序是否可以运行,因为支持的操作系统版本和执行级别)但我说的是 assemblyIdentity,我不太明白。

c# manifest assemblyinfo

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

为什么IntelliSense认为我的字典中的值是动态的?

说我有以下方法:

private void something()
{
    string text = "This is obviously a string";
    dynamic pietje = Guid.NewGuid();

    var dict = new Dictionary<Guid, string>();
    dict.Add(pietje, text);

    var someText = dict[pietje];
}
Run Code Online (Sandbox Code Playgroud)

下面的图片显示IntelliSense仍然认为它是动态的,即使我没有看到这可能是一个字符串以外的任何东西(或null)
在此输入图像描述

我错过了一个设置还是有什么东西阻止IntelliSense知道someText应该是一个字符串?我可能会过度依赖IntelliSense,但某些对象很难正确地手动输入整个方法或属性名称.

那是什么原因呢?我有什么办法可以解决这个问题吗?

很明显我可以通过多种方式修复它:

string someText = dict[pietje];
var someText = dict[(Guid)pietje];
var someText = dict[pietje] as string;
Run Code Online (Sandbox Code Playgroud)

但这不是重点,也不是我想要的.

c# intellisense dynamic visual-studio

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

合并出错后检索丢失的代码

所以我们犯了一个菜鸟错误,我们的一个项目团队成员已经忘记了几个星期(其中一些是假期),但是当他确实犯了错误时,他写的大部分代码都被覆盖了尝试自动解决所有冲突后,服务器上的内容.

那么有没有办法让他以前在他的电脑上获得的代码?因为很多工作已经丢失,我们真的无法再承担这一切.

所以只是为了澄清,丢失的代码不在服务器上,而是他在客户机上的未提交的更改.

我们正在使用团队基础服务器和visual studio

merge-conflict-resolution visual-studio-2012 azure-devops

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

计算通用列表中所有属性的值

我只是想从我正在执行的特定自定义对象列表中添加值,如下所示:

private int CountChances()
{
    int totalChance = 0;
    foreach(var chance in this.Chances)
    {
       totalChance += chance.Value;
    }
    return totalChance;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有foreach循环的情况下更快地完成这项工作?我几乎可以肯定linq应该能够快速完成这项工作,但我似乎无法找到如何做到这一点.

c# linq list

0
推荐指数
2
解决办法
89
查看次数