Tag: .net 4.5

为什么我必须使用等待方法来异步运行。 如果我不想在继续之前等待方法完成怎么办?

我整天都在倾听MSDN文档,他们的异步编码理念让我感到困惑。 据我了解,如果调用异步方法,则不会阻止调用异步方法的线程。 然而,async总是与await配对,这似乎否定了async-ness,使得外部方法必须等待代码执行无论如何。 我不应该能够调用异步方法然后继续执行外部方法吗? 这是我遇到过的场景,或多或少: void reportSomethingHappened(info) – Collect info – HTTP POST info to logging server (ie. mixpanel, sentry) 这里将是一个调用方法: void largerProcess if (whatever) reportSomethingHappened(); bla; bla; 据我所知,由于POST请求可以异步完成,我应该能够将reportSomethingHappened()转换为异步方法(通过AFAIK,等待webrequest,并添加async关键字)。 但是largeProcess方法不需要等待(即等待)报告方法完成以执行bla bla。 然而,VS告诉我,使用异步方法,我可以等待它,或者它会同步发生,然后阻塞。 这不是单独打败它的目的吗? 我怎么写这个,以便reportSomethingHappened不会阻止greaterProcess的执行? (这本身就让我感到困惑,因为我认为这一直是异步的重点)

HttpClient:如何一次上传多个文件

我正在尝试使用System.Net.Http.HttpClient上传多个文件。 using (var content = new MultipartFormDataContent()) { content.Add(new StreamContent(imageStream), “image”, “image.jpg”); content.Add(new StreamContent(signatureStream), “signature”, “image.jpg.sig”); var response = await httpClient.PostAsync(_profileImageUploadUri, content); response.EnsureSuccessStatusCode(); } 这只发送mulipart / form-data,但我预计会在post中的某个地方使用multipart / mixed。 更新:好的,我到了。 using (var content = new MultipartFormDataContent()) { var mixed = new MultipartContent(“mixed”) { CreateFileContent(imageStream, “image.jpg”, “image/jpeg”), CreateFileContent(signatureStream, “image.jpg.sig”, “application/octet-stream”) }; content.Add(mixed, “files”); var response = […]

操作完成前MVC4 + async / await +返回响应

在我的MVC4应用程序中,我需要添加一个控制器来上传和处理大文件。 文件上传后,我需要立即启动该文件的异步处理并将响应返回给浏览器,而无需等待处理完成。 显然我可以手动启动一个新线程来处理文件,但是我想知道我是否可以使用.net 4.5引入的async / await机制来实现这个场景 为了测试这个概念,我尝试过这样的事情: public async Task Test() { TestAsync(); return View(“Test”); } public async void TestAsync() { await LongRunning(); } private Task LongRunning() { return Task.Factory.StartNew(() => Pause()); } private int Pause() { Thread.Sleep(10000); return 3; } 异步机制似乎一般工作:当我调试代码时,我点击“返回视图(”测试“);” 行“返回3”之前的行。 但是,浏览器仅在Pause方法完成后才会收到响应。 这看起来像常规异步控制器(具有Async和Completed方法的控制器)。 有没有办法在控制器中为我的场景使用async / await?

如何将zip文件内容提取到.NET 4.5中的文件夹中

以下问题的答案似乎概述了如何使用System.IO.Commpression.ZipFile.ExtractToDirectory方法调用来提取文件。 在添加对System.IO.Compression的引用时,.NET 4.5中似乎不存在“ZipFile”。 如何从.NET 4.5中的* .zip文件中提取文件? 如何使用C#4.0从文件夹解压缩所有.Zip文件,而不使用任何OpenSource Dll? 这似乎显示了如何压缩文件。 但我正在寻找相反的方向。 在.NET 4.5中压缩文件 甚至这个问题在源代码中引用了“ZipFile”。 但我似乎无法找到这门课。 如何从C#.NET 4.5中的zip存档中提取特定目录? 编辑: 请注意7z.exe(来自7zip包)是如何工作的。 必须与.NET和7zip发生冲突。 ZipFile现在似乎工作正常。 private void extract_Click(object sender, EventArgs e) { string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; exePath = @”C:\test”; // path during troubleshooting ////var cmd1 = “cd \”” + exePath + “\””; ////ExecuteCommand(cmd1, 100, exePath); //var cmd2 = “\”” + […]

使用{get;实现只读属性 }

为什么不运行: class Program { static void Main(string[] args) { Apple a = new Apple(“green”); } } class Apple { public string Colour{ get; } public Apple(string colour) { this.Colour = colour; } }

包含System.IO.Compression 时,当前上下文中不存在名称“ZipFile”

我目前正在运行.net 4.5版,我正在尝试使用它的“新”zip函数。我包括System.IO.Compression ,我正在尝试运行以下代码: using System.IO.Compression; string startPath = @”c:\example\start”; string zipPath = @”c:\example\result.zip”; string extractPath = @”c:\example\extract”; ZipFile.CreateFromDirectory(startPath, zipPath); ZipFile.ExtractToDirectory(zipPath, extractPath); 我得到的问题是The name ‘ZipFile does not exist in the current context 。 如果我已经在使用需要它的东西,我不知道它为什么不存在。

不在C#应用程序中发送串行数据

我有两个Arduinos允许使用串行监视器通过串行端口进行消息交换。 如果我在双方使用串行监视器一切正常。 如果我使用我的C#应用​​程序没有任何反应。 我试图从串行监视器发送C#应用程序,它可以工作,但不是相反的。 // … comPort1.Open(); // … private void comPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { this.Invoke(new EventHandler(processData)); } private void processData(object sender, EventArgs e) { string inData = comPort1.ReadExisting(); msgBoxLog.AppendText(inData); } // … private void sendButton_Click(object sender, EventArgs e) { string my_str = “my string”; msgBoxLog.AppendText(msgBox.Text + my_str); comPort1.Write(msgBox.Text); } RtsEnable和DtrEnable都已启用

如何在不中断async / await的情况下创建HttpWebRequest?

我有一堆慢function,基本上是这样的: private async Task<List> DownloadSomething() { var request = System.Net.WebRequest.Create(“https://valid.url”); … using (var ss = await request.GetRequestStreamAsync()) { await ss.WriteAsync(…); } using (var rr = await request.GetResponseAsync()) using (var ss = rr.GetResponseStream()) { //read stream and return data } } 除了调用WebRequest.Create之外,这很好地和异步地工作 – 这一行将UI线程冻结几秒钟,这会破坏async / await的目的。 我已经使用BackgroundWorker编写了这个代码,它完美运行并且永远不会冻结UI。 但是, 创建与async / await相关的Web请求的正确,惯用方法是什么? 或者也许应该使用另一个类? 我已经看到了关于异步化WebRequest 这个很好的答案 ,但即使在那里,对象本身也是同步创建的。

Azure Active Directory Graph Client 2.0 – 上下文当前未跟踪实体

我最近安装了Azure Active Directory Graph Client Library 2.0.2 Nuget包,无法将成员添加到组,无论是将组添加到组还是将用户添加到组我在调用AddLink函数时收到以下错误: “[System.InvalidOperationException] = {”上下文当前没有跟踪实体。“} 我的代码: IGroup group = azureClient.Groups.GetByObjectId(“Guid here”).ExecuteAsync().Result; IGroup groupToAdd = azureClient.Groups.GetByObjectId(“Guid here”).ExecuteAsync().Result; azureClient.Context.AddLink(group, “Members”, groupToAdd); azureClient.Context.SaveChanges(); 我无法在进行Google搜索时找到与Azure Active Directory图形客户端库相关的此错误,因此对此有任何帮助将非常感激。

一个任务可以有多个等待者吗?

我正在为Windows 8项目提供异步服务,并且有一些此服务的异步调用,一次只能调用一次。 public async Task CallThisOnlyOnce() { PropagateSomeEvents(); await SomeOtherMethod(); PropagateDifferentEvents(); } 由于你无法在锁定语句中封装异步调用,我想到使用AsyncLock模式,但我认为我可能会尝试这样的事情: private Task _callThisOnlyOnce; public Task CallThisOnlyOnce() { if(_callThisOnlyOnce != null && _callThisOnlyOnce.IsCompleted) _callThisOnlyOnce = null; if(_callThisOnlyOnce == null) _callThisOnlyOnce = CallThisOnlyOnceAsync(); return _callThisOnlyOnce; } private async Task CallThisOnlyOnceAsync() { PropagateSomeEvents(); await SomeOtherMethod(); PropagateDifferentEvents(); } 因此,最终只能同时执行CallThisOnlyOnceAsync调用,并且多个awaiters挂钩在同一个Task上。 这是一种“有效”的方法吗?或者这种方法有一些缺点吗?