【问题标题】:Async try-catch-wait one second block?异步 try-catch-wait 一秒块?
【发布时间】:2016-10-26 06:38:06
【问题描述】:

我仍然不能完全理解 async/await 方法和线程以及究竟有什么区别,但我正在尝试使用它们以便更好地理解它们,所以请注意我所做的一切可能是根本性的错了。
我有一个用作服务器的控制台应用程序,首先它创建一个 HttpListener 对象并调用 BeginGetContext,每次回调函数执行时,它都会启动另一个 BeginGetContext。另一方面,在主线程中(我认为),我读取了给控制台的命令并在主线程中执行它。 现在我将数据存储在字典中,我可以使用这些命令对字典进行序列化和反序列化。我想在某个时候另一个正在运行的 c# 应用程序将使用这个序列化的数据来喜欢进程来进行统计或其他什么。我想如果一个程序正在读取这些数据,而另一个程序也试图读取它,它会抛出一些异常并破坏程序的流程并变成一堆乱七八糟的副本。因此,我每次想从任一程序获取数据时都考虑进行这些 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 请求都运行。我真的应该启动一个线程并关闭它以打开文件吗?我可能做的一切都错了吗?此外,如果异步函数在单独的线程上运行,程序不应该在某个时候用完线程吗? 在此先感谢并为这个冗长的问题道歉。

【问题讨论】:

  • 发布一些代码比描述代码有用得多。
  • if async functions run on seperate threads - 他们没有。

标签: c# multithreading async-await


【解决方案1】:

我仍然不能完全理解 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 方法。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2019-02-11
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多