相关疑难解决方法(0)

在C#中执行fire and forget方法的最简单方法是什么?

我在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 c# nonblocking

134
推荐指数
9
解决办法
8万
查看次数

如果我不等待任务会怎样?

考虑这个例子:

var task = DoSomething()
bool ready = await DoSomethingElse();
if (!ready) 
  return null;

var value = await DoThirdThing(); // depends on DoSomethingElse
return value + await task;
Run Code Online (Sandbox Code Playgroud)

DoSomething做一些可能需要一段时间的非常重要的工作,因此我们首先开始它.
与此同时,我们检查我们是否准备就绪,DoSomethingElse如果没有,我们会提前退出.
我们DoThirdThing 只有在我们这样做时才会打电话ready,因为宇宙可能会爆炸.

我们不能用Task.WhenAll作为DoThirdThing依赖DoSomethingElse,我们也不想等待DoSomething,因为我们希望尽可能地其他两种方法同时调用.

问题:发生什么task,如果我们不能ready和退出早?

它抛出的任何异常会被重新抛出SynchronizationContext吗?
如果task正常完成会有问题吗,因为没有人消耗它的价值?

后续行动:有没有一种简洁的方法可以确保task等待?

我们可以简单地说,await task如果我们不是ready,但如果有50个退出条件,这将是非常繁琐的.
可以使用finally块来await task重新抛出潜在的异常吗?如果task正常完成,将在finally块中再次等待,但这不应该导致任何问题?

c# async-await

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

System.Threading.Tasks中的NullReferenceException调用HttpClient.GetAsync(url)

我的MVC 4.0应用程序中有一个奇怪的问题.我使用REST Web服务(Amazon Associate).我创建了一个方法,我从各处使用它.缩短版本是这样的:

    private async Task<XElement> GetRequest(string url)
    {
        string myresponse;
        HttpResponseMessage response = null;
        HttpClient client = new HttpClient();            
        try
        {
            response = await client.GetAsync(url);
            myresponse = response.Content.ToString();
            if (myresponse.Contains("503"))
            {
                myTrace.WriteLine("503 Sleep.....");
                Thread.Sleep(3000); // looks like amazon us does not like fast requests....
                return await GetRequest(url); //restart after pausing....
            }
        }
        catch (TaskCanceledException ex)
        {
            myTrace.WriteLine("TaskCancelled From GetRequest: " + ex);
            return null;
        }

        catch (HttpRequestException ex)
        {
            myTrace.WriteLine("RequestException Sleep.....");
            Thread.Sleep(300000); // 5 minutes de pause 
        } …
Run Code Online (Sandbox Code Playgroud)

c# async-await

12
推荐指数
2
解决办法
8055
查看次数

标签 统计

c# ×3

async-await ×2

.net ×1

nonblocking ×1