Maui学习笔记-SignalR简单介绍

SignalR是ASP.NET Core中的一个库,支持服务器与其连接的客服端之间的双象通信,它允许服务器立即将更新的消息推送到客服端,而不是要求客户端轮询服务器来获取更新

创建项目

使用SignalR在服务器实时发送消息给客服端,客服端拿到消息后在UI页面更新

首先创建一个Web API项目

添加一个BidsHub类继承自Hub

public class BidsHub:Hub
{
    public static bool IsAuctionRunning = true;

    public void AcceptBig(string winner)
    {
        IsAuctionRunning = false;
    }
}

 

  • 注册SignalR服务,并设置API接口

注册服务
builder.Services.AddSignalR();


var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseHttpsRedirection();
//
app.MapHub<BidsHub>("/auction");

//获取服务
using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var hubContext = services.GetRequiredService<IHubContext<BidsHub>>();
  //启动任务
    _ = Task.Run(async () =>
    {
        Random random = new Random();
        int price = 1;
      //循坏出价价格
        while (BidsHub.IsAuctionRunning)
        {
            price = random.Next(price, price + 100);
            await hubContext.Clients.All.SendAsync("BidReceived", new
            {
                Bidder = $"Company{random.Next(1, 10)}",
                Price = price
            });
          //随机延迟一个发送消息的时间
            await Task.Delay(random.Next(500, 5000));
        }
    });
}

app.Run();

创建Maui项目 

首先需要安装NuGet包

  • Microsoft.AspNetCore.SignalR.Client

  • CommunityToolkit.Mvvm

  • CommunityToolkit.Maui(需要在program.cs中引入)

  • 创建一个类来接收服务器的数据

public class BidData(string bidder, decimal price)
{
    public string Bidder { get; set; } = bidder;
    public decimal Price { get; set; } = price;

}
  • 创建ViewModel

[ObservableObject]
public partial class MainViewModel
{
  //引入SignalR Hub连接对象
    HubConnection _hubConnection;
    private bool isBidAccepted;
    [ObservableProperty] private ObservableCollection<BidData> _bids = new();
	//连接服务器
    [RelayCommand]
    async Task Initialize()
    {
        _hubConnection = new HubConnectionBuilder()
            .WithUrl("你的IP地址/auction")
            .Build();

        _hubConnection.On<BidData>("BidReceived", bid =>
        {
            Bids.Insert(0, bid);
        });
        await _hubConnection.StartAsync();
    }
//接受出价命令
    [RelayCommand(CanExecute = nameof(CanAcceptBid))]
    async Task AcceptBid(BidData bid)
    {
        await _hubConnection.InvokeCoreAsync("AcceptBid", args:[bid.Bidder]);
        isBidAccepted = true;
    }

    bool CanAcceptBid()=> !isBidAccepted;
}
  • MainPage

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:vm = "clr-namespace:SignalRMaui.ViewModels"
             xmlns:model="clr-namespace:SignalRMaui.Models"
             xmlns:tk="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             x:Class="SignalRMaui.MainPage">
    <ContentPage.Behaviors>
        <tk:EventToCommandBehavior EventName="Appearing" Command="{Binding InitializeCommand}"/>
    </ContentPage.Behaviors>
    <ContentPage.BindingContext>
        <vm:MainViewModel/>
    </ContentPage.BindingContext>
    <ContentPage.Resources>
        <DataTemplate
            x:Key="bidTemplate"
            x:DataType="model:BidData">
            <Grid ColumnDefinitions="*,100"
                  RowDefinitions="30,26"
                  Padding="1,18">
                <Label
                    Text="{Binding Price,StringFormat='{0:C0}'}"
                    TextColor="LawnGreen"
                    FontSize="20"/>
                <Label
                    Text="{Binding Bidder}"
                    Grid.Row="1"/>
                <Button Text="接受"
                        Command="{Binding Path=BindingContext.AcceptBidCommand,Source={RelativeSource Mode=FindAncestor,AncestorType={x:Type CollectionView}}}"
                        CommandParameter="{Binding}"
                        HeightRequest="40"
                        Grid.Column="1"
                        Grid.RowSpan="2"/>
            </Grid>
        </DataTemplate>
    </ContentPage.Resources>
    <CollectionView
        ItemsSource="{Binding Bids}"
        ItemTemplate="{StaticResource bidTemplate}"></CollectionView>

    

</ContentPage>
IOS下运行程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/959740.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

接口(完)

大家好&#xff0c;今天我们着重来总结一下接口的知识&#xff0c;并且将接口和抽象类的区别罗列一下&#xff0c;帮助我们更好的认识抽象类和接口。 2.7 抽象类和接口的区别. 抽类和接口都是Java中多态的常见使用方式,都需要重点掌握,同时又要认清两者的区别(重要!!&#xf…

机器学习-线性回归(参数估计之经验风险最小化)

给定一组包含 &#x1d441; 个训练样本的训练集 我们希望能够 学习一个最优的线性回归的模型参数 &#x1d498; 现在我们来介绍线性回归的一种模型参数估计方法&#xff1a;经验风险最小化。 我们前面说过&#xff0c;对于标签 &#x1d466; 和模型输出都为连续的实数值&…

77,【1】.[CISCN2019 华东南赛区]Web4

有句英文&#xff0c;看看什么意思 好像也可以不看 进入靶场 点击蓝色字体 我勒个豆&#xff0c;百度哇 所以重点应该在url上&#xff0c;属于任意文件读取类型 接下来该判断框架了 常见的web框架如下 一&#xff0c;Python 框架 1.Flask URL 示例 1&#xff1a;http://…

c语言中的数组(上)

数组的概念 数组是⼀组相同类型元素的集合&#xff1b; 数组中存放的是1个或者多个数据&#xff0c;但是数组元素个数不能为0。 数组中存放的多个数据&#xff0c;类型是相同的。 数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…

景联文科技加入AIIA联盟数据标注分委会

2025年1月16日&#xff0c;中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;数据委员会数据标注分委会&#xff08;以下简称“分委会”&#xff09;正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…

[笔记] 极狐GitLab实例 : 手动备份步骤总结

官方备份文档 : 备份和恢复极狐GitLab 一. 要求 为了能够进行备份和恢复&#xff0c;请确保您系统已安装 Rsync。 如果您安装了极狐GitLab&#xff1a; 如果您使用 Omnibus 软件包&#xff0c;则无需额外操作。如果您使用源代码安装&#xff0c;您需要确定是否安装了 rsync。…

消息队列篇--通信协议篇--AMOP(交换机,队列绑定,消息确认,AMOP实现实例,AMOP报文,帧,AMOP消息传递模式等)

AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;是一种开放的、跨平台的消息传递协议&#xff0c;旨在提供一种标准化的方式在不同的消息代理和客户端之间进行消息传递。AMQP不仅定义了消息格式和路由机制&#xff0c;还规定了如何…

小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统

全新首发小利特惠/生活缴费/电话费/油卡燃气/等充值业务类源码附带U商承兑系统 安装教程如下 图片:

HTML<hgroup>标签

例子&#xff1a; 使用hgroup元素标记标题和段落是相关的&#xff1a; <hgroup> <h2>Norway</h2> <p>The land with the midnight sun.</p> </hgroup> 定义和用法&#xff1a; 标签<hgroup>用于包围标题和一个或多个<p&g…

14-6-3C++STL的list

&#xff08;一&#xff09;list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝&#xff0c;返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…

【2024年终总结】深圳工作生活评测

距离上次写年终总结已经过了一年半了&#xff0c;这一年半中哪怕经历了很多的事情&#xff0c;但是感觉又没发生什么。想写一些骚话&#xff0c;却总觉得自己无法完全表达&#xff0c;便也就这样&#xff0c;静静地记录下这一段时光。 现在是2025年&#xff0c;春节前的时光&am…

前端jquery 实现文本框输入出现自动补全提示功能

git仓库&#xff1a;web_study/some-demos/inputAutoFit at main Cong0925/web_study (github.com) 压缩包&#xff1a;已绑定到指定资源 示例图&#xff1a; 实现说明: 1.首先&#xff0c;html部分设置好相关的定位标签如图&#xff1a; 2.主要函数 3.默认数据

(5)STM32 USB设备开发-USB键盘

讲解视频&#xff1a;2、USB键盘-下_哔哩哔哩_bilibili 例程&#xff1a;STM32USBdevice: 基于STM32的USB设备例子程序 - Gitee.com 本篇为使用使用STM32模拟USB键盘的例程&#xff0c;没有知识&#xff0c;全是实操&#xff0c;按照步骤就能获得一个STM32的USB键盘。本例子是…

java后端之登录认证

基础登录功能&#xff1a;根据提供的用户名和密码判断是否存在于数据库 LoginController.java RestController Slf4j public class LoginController {Autowiredprivate UserService userService;PostMapping("/login")public Result login(RequestBody User user) {…

Spring--Bean的生命周期和循环依赖

Bean的生命周期和循环依赖 Bean 的生命周期了解么?Spring中的循环引用什么是循环引用&#xff1f;三级缓存解决循环依赖总结构造方法出现了循环依赖怎么解决&#xff1f; Bean 的生命周期了解么? 整体上可以简单分为四步&#xff1a;实例化 —> 属性赋值 —> 初始化 —…

【云安全】云原生-Docker(五)容器逃逸之漏洞利用

漏洞利用逃逸 通过漏洞利用实现逃逸&#xff0c;主要分为以下两种方式&#xff1a; 1、操作系统层面的内核漏洞 这是利用宿主机操作系统内核中的安全漏洞&#xff0c;直接突破容器的隔离机制&#xff0c;获得宿主机的权限。 攻击原理&#xff1a;容器本质上是通过 Linux 的…

【Uniapp-Vue3】request各种不同类型的参数详解

一、参数携带 我们调用该接口的时候需要传入type参数。 第一种 路径名称?参数名1参数值1&参数名2参数值2 第二种 uni.request({ url:"请求路径", data:{ 参数名:参数值 } }) 二、请求方式 常用的有get&#xff0c;post和put 三种&#xff0c;默认是get请求。…

基于SpringBoot的软件产品展示销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

hedfs和hive数据迁移后校验脚本

先谈论校验方法&#xff0c;本人腾讯云大数据工程师。 1、hdfs的校验 这个通常就是distcp校验&#xff0c;hdfs通过distcp迁移到另一个集群&#xff0c;怎么校验你的对不对。 有人会说&#xff0c;默认会有校验CRC校验。我们关闭了&#xff0c;为什么关闭&#xff1f;全量迁…

mysql学习笔记-数据库的设计规范

1、范式简介 在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。 1.1键和相关属性的概念 超键:能唯一标识元组的属性集叫做超键。 候选键:如果超键不包括多余的属性&#xff0c;那么这个超键就是候选键 主键:用户可以从候选键中选择一个作为主键。 外…