异步try-catch-等待一秒块?

时间:2016-10-25 19:46:06

标签: c# multithreading async-await

我仍然不能完全理解async / await方法和线程以及它们之间的区别是什么,但我正在尝试使用它们以便我能更好地理解它们,所以请注意我正在做的一切可能是fundementaly错了。
我有一个作为服务器的控制台应用程序,首先它创建一个HttpListener对象并调用BeginGetContext,每次执行回调函数时,它都会启动另一个BeginGetContext。另一方面,在主线程(我认为)中,我读取了给控制台的命令并在主线程中执行它。 现在我将数据存储在字典中,我可以使用这些命令进行序列化和反序列化。我想在某个时候另一个正在运行的c#app将使用这个序列化数据来进行统计或其他任何过程。我想如果一个程序正在读取这些数据,而另一个程序也试图读取它,它会抛出一些异常并破坏程序的流程并变成一堆副本。所以每当我想从任一程序中获取数据时,我都会考虑进行这些try-catch检查:

static bool IsFileAvailable(FileInfo file)
{
    FileStream stream = null;
    try { stream = file.Open(FileMode.Open); }
    catch (IOException) { return false; }
    finally { if (stream != null) stream.Close(); }
    return true;
}

在主线程中,我测试,如果文件IsFileAvailable,我得到文件,否则,我希望主线程继续执行,而某些方法(我猜是异步)测试IsFileAvailable每隔一秒左右,然后放弃之后也许30秒,并留言给控制台。我不知道使用什么方法来保持主线程和HttpListener请求都在运行。我应该实际启动一个线程并关闭它以使文件打开?我可能做的一切都是错误的吗?此外,如果异步函数在单独的线程上运行,那么程序在某些时候不应该用完线程吗? 提前致谢并为长期问题道歉。

1 个答案:

答案 0 :(得分:2)

  

我仍然无法完全理解async / await方法

Async只是一个将方法标记为异步的关键字。默认情况下,当等待未完成的任务时,捕获当前的“上下文”并用于在任务完成时恢复该方法。这个“上下文”是当前的SynchronizationContext,除非它是null,在这种情况下它是当前的TaskScheduler。

  

我想如果一个程序正在读取这些数据而另一个程序也试图读取它,它会抛出一些异常并破坏程序的流程并变成一堆副本。

多个线程的数据读取如果数据不为空,则不会导致错误,并且您不会同时尝试更改数据。 您编写的代码完全阻止了主线程。如果您打算将此方法设为异步,则应该异步启动任务并在主线程中调用它,如下所示:

private static async Task<bool> IsFileAvailable(FileInfo file)
    {
        //Your Code
    }
public static async Task DoStuff()
    {
        await Task.Run(() =>
        {
            LongRunningOperation();
        });   
    }
static void Main()
    {
       DoStuff();
       //Other Codes
    }

但是因为没有等待这个调用,所以在完成任务之前,main方法的执行仍在继续。请注意,您无法在Main()中等待它,因为它是一个控制台应用程序,并且根本无法等待Main方法。

相关问题