我一直在研究如何使用异步等待,但是当我们有多个互相调用的方法时,我不太了解它。我们应该始终使用等待还是仅在实际准备好使用结果时才使用等待?
因此,例如,我们应该这样做吗:
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吗?
我得到以下异常(在文本中以荷兰语,英语翻译),当我按下"确定"时它会中断我的调试器,它会停止调试会话并关闭应用程序:
文字翻译:
---------------------------
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%确定).
更改的属性是用户控件,不知何故,我认为调试器无法正确处理用户控件?也许?
有谁见过这种行为,并知道如何解决这个问题?我是否需要关闭(或打开)某些调试设置?
问题: 将应用程序部署到生产数据库时,出现以下错误:
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 …
在你去使用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) 对于我们一直在研究的一个项目,我们使用了一个并发字典,这很好,直到出现一个要求对字典进行排序的新规范(它应该保持添加的顺序,有点像 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)
但是,如果事情失败,我们不会删除它们并稍后再试。不幸的是,没有并发排序字典,但是有没有办法确保消息保持它们添加的顺序?
非常重要的是我们可以从列表/字典中获取多个对象而不删除它们(或者我们需要能够稍后将它们添加到前面)。
我正在使用带有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#中显示的方式相同.或相反亦然?
有没有办法在从数据库中获取它们并将它们放入数据库时进行转换,因此我不必在任何地方使用格式?
我已经在 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,我不太明白。
说我有以下方法:
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)
但这不是重点,也不是我想要的.
所以我们犯了一个菜鸟错误,我们的一个项目团队成员已经忘记了几个星期(其中一些是假期),但是当他确实犯了错误时,他写的大部分代码都被覆盖了尝试自动解决所有冲突后,服务器上的内容.
那么有没有办法让他以前在他的电脑上获得的代码?因为很多工作已经丢失,我们真的无法再承担这一切.
所以只是为了澄清,丢失的代码不在服务器上,而是他在客户机上的未提交的更改.
我们正在使用团队基础服务器和visual studio
我只是想从我正在执行的特定自定义对象列表中添加值,如下所示:
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# ×9
assemblyinfo ×1
async-await ×1
asynchronous ×1
azure-devops ×1
bouncycastle ×1
concurrency ×1
debugging ×1
dll ×1
dynamic ×1
firebird ×1
firebird2.5 ×1
guid ×1
intellisense ×1
linq ×1
list ×1
manifest ×1
mysql ×1
ssl ×1
stream ×1
uuid ×1