C# Xamarin Forms - 执行任务,超时

2024-03-23

和其他许多人一样,我需要编写一个返回任务的函数,并且我希望该任务在一段时间后自动超时。

初始代码如下所示:

class MyClass
{
    TaskCompletionSource<string> m_source;

    public Task<string> GetDataFromServer()
    {
        m_source = new TaskCompletionSource<string> ();

        // System call I have no visibility into, and that doesn't inherently take any
        // sort of timeout or cancellation token
        ask_server_for_data_and_when_youve_got_it_call(Callback);

        return m_source.Task;
    }

    protected void Callback(string data);
    {
        // Got the data!
        m_source.TrySetResult(data);
    }
}

现在我希望它更聪明一点,并在适当的时候自动超时。我有几种选择来执行此操作:

class MyClass
{
    TaskCompletionSource<string> m_source;

    public Task<string> GetDataFromServer(int timeoutInSeconds)
    {
        m_source = new TaskCompletionSource<string> ();

        ask_server_for_data_and_when_youve_got_it_call(Callback);

        // Method #1 to set up the timeout:
        CancellationToken ct = new CancellationToken ();
        CancellationTokenSource cts = CancellationTokenSource.CreateLinkedTokenSource (ct);
        cts.CancelAfter (timeoutInSeconds * 1000);
        cts.Token.Register(() => m_source.TrySetCancelled());

        // Method #2 to set up the timeout:
        CancellationTokenSource ct2 = new CancellationTokenSource ();
        ct2.CancelAfter (timeoutInSeconds * 1000);
        ct2.Token.Register (() => m_source.TrySetCancelled());

        // Method #3 to set up the timeout:
        System.Threading.Tasks.Task.Factory.StartNew (async () =>
        {
            await System.Threading.Tasks.Task.Delay (timeoutInSeconds * 1000);
            m_source.TrySetCancelled();
        });

        // Method #4 to set up the timeout:
        Xamarin.Forms.Device.StartTimer (new TimeSpan (0, 0, timeoutInSeconds),
            () => m_source.TrySetCancelled());

        return m_source.Task;
    }

    protected void Callback(string data);
    {
        // Got the data!
        m_source.TrySetResult(data);
    }
}

4 种不同的超时设置方式有何优缺点?例如,我猜测方法 #2 是最“轻量级”的(需要最少的系统资源)?

还有其他方法可以设置我错过的超时吗?

p.s.

我通过艰难的方式发现了一个知识 - 如果您从主 UI 线程之外的线程调用 GetDataFromServer() :

Task.Run(() => await GetDataFromServer());    

在 iOS 上,第四种方法 (Xamarin.Forms.Device.StartTimer) 永远不会触发


我认为使用它更容易Task.Delay and Task.WhenAny:

public async Task<string> GetDataFromServerAsync(int timeoutInSeconds)
{
  Task<string> requestTask = GetDataFromServerAsync();
  var timeoutTask = Task.Delay(timeoutInSeconds);
  var completedTask = await Task.WhenAny(requestTask, timeoutTask);
  if (completedTask == timeoutTask)
    throw new OperationCanceledException();
  return await requestTask;
}

其他方法的缺点:

方法#1:创建一个新的CancellationToken没原因。它只是方法#2 的低效版本。

方法#2:通常,您应该处理以下结果Register一旦任务完成。在这种情况下,它可能会正常工作,因为 CTS 最终总是被取消。

方法#3:使用StartNew只是打电话Delay- 不确定那里的推理。它本质上是一个效率较低的版本Delay with WhenAny.

方法#4:可以接受。虽然你确实必须处理TaskCompletionSource<T>及其怪癖(例如,默认情况下的同步延续)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# Xamarin Forms - 执行任务,超时 的相关文章

  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • RestSharp RestClient的默认超时值是多少?

    任何人都知道默认超时值休息锐利 https github com restsharp 休息客户端 RestSharp 在底层使用 HttpWebRequest 它有一个默认超时 https msdn microsoft com en us
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 将特殊字符传递到 telnet Unix

    我使用以下命令通过 SMS 适配器发送 SMS 消息 telnet localhost 0000 lt lt EOF helo x MAIL FROM Test RCPT TO 447999999999 DATA Test 1234 log
  • JavaScript 中的“IsNullOrWhitespace”?

    是否有与 NET 等效的 JavaScriptString IsNullOrWhitespace https learn microsoft com en us dotnet api system string isnullorwhites
  • Mongo - 如何在单个查询中更新具有不同值的多个文档?

    我想编写一个查询来在单个查询中更新多个文档 请建议我可能的方法 以下是我的 mongo 文档 id ObjectId 5b0f0a2ca1f6633032c204cd parent id ObjectId 5b0f09e1a1f663303
  • 从 C# 调用 PowerShell cmdlet 会抛出 CommandNotFoundException

    我正在尝试致电Add AppxPackage来自 C 的 cmdlet 我找到了 MSDN 文章从 C 代码运行 PowerShell http msdn microsoft com en us library dd182449 28v v
  • axios catch 没有捕获错误

    我在用着axios 0 17 0使用以下代码 this props userSignupRequest this state then res gt console log res data catch err gt this setSta
  • Mathematica 8 中函数声明的问题

    这是一个奇怪的结果 在此示例中函数定义为 functionB 有人可以解释一下吗 我想绘制functionB x and functionB Sqrt x 它们一定是不同的 但是这段代码表明functionB x functionB Sqr
  • 如何获得从一种颜色到另一种颜色的中间颜色? [复制]

    这个问题在这里已经有答案了 可能的重复 两种颜色之间的android颜色 基于百分比 https stackoverflow com questions 4414673 android color between two colors ba
  • 如何在 SQLite 中比较两个日期?

    我有点假设它是一个字符串 所以我将它作为一个字符串进行比较 但毫不奇怪它失败了 我相信这就是 Mysql 的工作原理 我可能是错的 因为我已经有一段时间没有工作了 无论哪种情况 如何检查 SQLite 中的日期是否相等 我将在 WHERE
  • Alamofire - 未进行代码签名,因为其设置未指定 Xcode 8 中的开发团队

    我在 Xcode 8 上遇到了下面的错误 大家能帮忙解决一下吗 我的应用程序需要支持iOS 8及以上版本 Alamofire 不会进行代码签名 因为其设置未指定开发团队 对于使用 Swift 的目标 需要正确配置 使用旧版 Swift 语言
  • 使用进程c#进行错误处理

    我使用 C 创建了一个控制台应用程序 并使用以下命令从另一个 Windows 窗体应用程序调用它Process 下面是我的控制台应用程序代码 static void Main string args try my code catch Ex
  • JDBCRealm 和 DataSourceRealm 有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读到了这样的评论 根本不要使用 JDBCRealm 它根本无法扩展 因为有一个 JDBC Connection 对象用于所有数据库通
  • python和谷歌云存储

    我找不到如何使用谷歌云存储而不在谷歌应用程序引擎上运行它的示例 我想要这样的东西 这对我很有用 https github com GoogleCloudPlatform storage getting started javascript
  • JQuery 更改在模糊之前不会触发

    我使用change handler 来监听textarea的更改事件 但我只在textarea失去焦点时收到事件 但我想在值更改时立即收到事件 text object change listener function listener do
  • 避免在自定义交叉过滤器归约函数中进行多次求和

    这个问题是由于创建过程中遇到的一些困难而产生的crossfilter数据集 特别是如何对不同维度进行分组并计算派生值 最终目标是拥有一批dc js使用维度和组的图表 小提琴示例https jsfiddle net raino01r 0vjt
  • 用户日期时间设置为 GMT,如何将日期转换为其本地化设置?

    在我的用户设置中 我有一个下拉菜单 其中包含所有 GMT 日期供用户选择 在 C 中 如何将数据库中存储的日期时间转换为 GMT 时间 数据库中存储的时间为服务器时间 对于 NET 3 5 您可以将系统时区标识符与用户一起存储 您可以从Ti
  • 浏览器如何处理高度和宽度的非整数值?

    当浏览器给出的元素的宽度和高度不是整数值时 它们如何处理它们 尤其 非整数值在什么阶段进行四舍五入 它们是四舍五入到最接近的整数 还是截断它们 当容器的子元素具有非整数尺寸时 是否会出现子元素长度或高度之和不等于父元素的内部宽度 高度的情况
  • 显示 UILabel * 秒;除了 NSTimer 之外还有其他方法吗?

    是否有其他方式显示对象 按钮 其他内容 例如 3 秒而不是 NSTimer 我可以使用动画来做到这一点吗 您可以使用 performSelector withObject afterDelay 尽管它内部使用了一个计时器 theLabel
  • 获取 NSTextField 内容以缩放

    我怎样才能让文本比例适合我给它的边界 我过去也做过类似的事情 void calcFontSizeToFitRect NSRect r float targetWidth r size width xMargin float targetHe
  • C++ 按升序打印文件名

    我正在使用以下代码来迭代目录中的文件 该目录中的所有文件都有编号 每个文件都有唯一的编号 下面的代码成功打印出目录中的所有文件 但不是按升序排列 它完全随机出现 并且有一个文件是重复的 我找不到另一种打印文件或按升序打印文件的方法 我确实需
  • C# Xamarin Forms - 执行任务,超时

    和其他许多人一样 我需要编写一个返回任务的函数 并且我希望该任务在一段时间后自动超时 初始代码如下所示 class MyClass TaskCompletionSource