在什么情况下会想要使用
public async Task AsyncMethod(int num)
Run Code Online (Sandbox Code Playgroud)
代替
public async void AsyncMethod(int num)
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一情况是,您是否需要能够跟踪其进度的任务.
此外,在以下方法中,async和await关键字是否不必要?
public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}
Run Code Online (Sandbox Code Playgroud) 在C#4.0中,我们已经Task在System.Threading.Tasks命名空间.之间有什么真正的改变Thread和Task.我为了学习而做了一些示例程序(帮助从MSDN获取)
Parallel.Invoke
Parallel.For
Parallel.ForEach
Run Code Online (Sandbox Code Playgroud)
但有很多疑问,因为这个想法并不那么清楚.
我最初在Stackoverflow中搜索了类似类型的问题但可能是这个问题标题我无法得到相同的.如果有人知道之前发布的相同类型的问题,请提供链接的参考.
我可能会遗漏一些东西但是做什么之间有什么不同:
public void MyMethod()
{
Task t = Task.Factory.StartNew(DoSomethingThatTakesTime);
t.Wait();
UpdateLabelToSayItsComplete();
}
public async void MyMethod()
{
var result = Task.Factory.StartNew(DoSomethingThatTakesTime);
await result;
UpdateLabelToSayItsComplete();
}
private void DoSomethingThatTakesTime()
{
Thread.Sleep(10000);
}
Run Code Online (Sandbox Code Playgroud) 我在WCF中看到他们有[OperationContract(IsOneWay = true)]属性.但是WCF似乎有点缓慢而且很重要,只是为了创建一个非阻塞功能.理想情况下会出现类似静态无效的阻塞MethodFoo(){},但我认为不存在.
在C#中创建非阻塞方法调用的最快方法是什么?
例如
class Foo
{
static void Main()
{
FireAway(); //No callback, just go away
Console.WriteLine("Happens immediately");
}
static void FireAway()
{
System.Threading.Thread.Sleep(5000);
Console.WriteLine("5 seconds later");
}
}
Run Code Online (Sandbox Code Playgroud)
注意:阅读此内容的每个人都应该考虑他们是否真的想要完成这个方法.(参见#2最佳答案)如果方法必须完成,那么在某些地方,比如ASP.NET应用程序,你需要做一些事情来阻止并保持线程活着.否则,这可能会导致"忘记但永远不会实际执行",在这种情况下,当然,根本不编写任何代码会更简单.(很好地描述了它在ASP.NET中的工作原理)
异步调用是否始终创建新线程?两者有什么区别?
异步调用是始终创建还是使用新线程?
在计算机编程中,异步事件是独立于主程序流发生的事件.异步操作是在非阻塞方案中执行的操作,允许主程序流继续处理.
我知道异步调用可以在单线程上完成吗?这怎么可能?
在.Net 4.5中,Microsoft添加了新Async/Await功能以简化异步编码.但是,我想知道
Async/Await完全取代旧的使用方式
Threads吗?Async/Await能够做任何一个的Thread可以异步呢?Async/Await只与像一些方法来使用WebClient.DownloadStringAsync或者我可以将任何同步方法,使其使用Async/Await和不阻塞主线程?请有人能够确认我是否正确理解了Async await关键字吗?(使用CTP的第3版)
到目前为止,我已经解决了在方法调用之前插入await关键字基本上做了两件事,A.它创建一个立即返回和B.它创建一个"延续",在完成异步方法调用时调用.在任何情况下,continuation都是该方法的代码块的其余部分.
所以我想知道的是,这两位代码在技术上是等价的,如果是这样,这基本上意味着await关键字与创建ContinueWith Lambda相同(即:它基本上是一个编译器快捷方式)?如果没有,有什么区别?
bool Success =
await new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text).Connect();
// At this point the method will return and following code will
// only be invoked when the operation is complete(?)
MessageBox.Show(Success ? "Logged In" : "Wrong password");
Run Code Online (Sandbox Code Playgroud)
VS
(new POP3Connector(
"mail.server.com", txtUsername.Text, txtPassword.Text ).Connect())
.ContinueWith((success) =>
MessageBox.Show(success.Result ? "Logged In" : "Wrong password"));
Run Code Online (Sandbox Code Playgroud) 请问.NET框架的async内置库/组件,它可以与文件系统的工作(例如File.ReadAllBytes,File.WriteAllBytes)?
还是我用我自己写的库async的方法StreamReader和StreamWriter?
像这样的东西会很不错:
var bytes = await File.ReadAllBytes("my-file.whatever");
Run Code Online (Sandbox Code Playgroud) 我认为关于async/await的一点是,当任务完成时,继续在调用await时在相同的上下文上运行,在我的情况下,这将是UI线程.
例如:
Debug.WriteLine("2: Thread ID: " + Thread.CurrentThread.ManagedThreadId);
await fs.ReadAsync(data, 0, (int)fs.Length);
Debug.WriteLine("3: Thread ID: " + Thread.CurrentThread.ManagedThreadId);
Run Code Online (Sandbox Code Playgroud)
我不指望这个:
2: Thread ID: 10
3: Thread ID: 11
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?为什么延续的线程ID与UI线程不同?
根据这篇文章 [^]我需要显式调用ConfigureAwait来改变连续上下文的行为!
c# ×8
async-await ×4
asynchronous ×4
.net ×2
.net-4.5 ×2
async-ctp ×1
c#-4.0 ×1
conceptual ×1
filesystems ×1
nonblocking ×1
terminology ×1