关于Silverlight中的多线程的理解

61、Silverlight 文件操作与多线程编程全解析 本文深入解析了 Silverlight 中的文件操作和多线程编程技术。详细介绍了如何使用 OpenFileDialog 和 SaveFileDialog 实现文件的读取与写入,并结合 Web 服务完成文件上传和下载功能。同时,全面讲解了 Silverlight 的多线程机制,包括 Thread 类、BackgroundWorker 和 ThreadPool 的使用方法及其适用场景,帮助开发者提升应用程序的性能与用户体验。 阅读详情

这段时间由于Silverlight的性能问题导致我们之前的项目客户很不满意,并要求整改,所以开始研究了一些性能相关的内容,其中一个就是Silverlight的线程模型是怎样的。把我自己从测试以及其他人的文章中得出的理解分享一下,有不对的地方也请指正啦:

第一条很重要的认识是,Silverlight只有一个主线程,也就是我们常说的UI线程。

第二条是这个主线程实际上负责很多的事情,例如,处理用户输入,呈现页面,运行动画等等。

这两条认识之所以重要,是因为它们会使我们对很多Silverlight中遇到的问题有深刻地理解,这里举几个例子说明一下。

1. 关于同步调用WCF问题的理解:

这里大家都熟悉的是异步调用WCF,之所以说成同步,是因为我们可能都有这样的需求,当我们调用一个WCF方法时发现,它依赖于之前调用的WCF方法的返回值。但是当我们尝试使用Windows Form开发中使用的多线程知识处理时(即阻止线程以等待另一个线程返回结果)发现,页面会被卡死。

对于这个问题的原因就是我们对于Silverlight的主线程没有很好地理解。其实我们在xaml代码页面里编写的大部分都是由主线程执行的,所以当我们正常在方法里阻止当前线程时,实际上阻止的是主线程(UI线程),这就是为什么卡死的原因了;另外要注意的是,异步调用WCF,实际是当主线程执行完一个方法或事件处理方法后,处于空闲状态时才会触发一个子线程去真正调用WCF方法。

由此一种解决方法是,开一个子线程去调用WCF方法,并在Completed事件处理方法里阻止当前线程,然后使用主线程或另外的子线程调用另一个WCF方法,并在这个方法的Completed事件处理方法里释放被阻止的线程,此时就可以达到同步的效果了。

2.关于在DataGrid控件里显示大数据量很慢问题的理解:

当需求里不希望使用分页进行显示大数量时,我们的代码就会遇到很大的性能问题。例如,在DataGrid控件里显示10万条数据,呵呵,可想而知,不卡都怪了。估计你在想,这和UI线程有什么关系呢?问题的在于绑定,因为通常我们将数据绑定到DataGrid上。

当Silverlight从服务端获取10万条数据后,这里不考虑网络传输和服务端处理所消耗的时间,只专注于Silverlight的部分,会将结果集放到数据集合里(如ObservableCollection),然后绑定到DataGrid控件上。由于Silverlight不允许跨线程访问UI控件的限制,这就导致不管你是使用子线程,还是使用UI线程填充集合,UI线程都要等待填充完毕后才能绑定到DataGrid控件上。这里Silverlight是有优化的,因为DataGrid控件默认启用UI虚拟化技术,只会绑定可见的行,这大大减少了显示时间,但是向集合里填充10万条数据就成为主要耗时部分。

对此的一种解决方法就是,向集合里填充部分数据,而不是一次性将10万数据都装载进去。服务端的具体做法不变,只是在DataGrid控件的LoadingRow事件里判断一下是否已经到浏览的底部,这里假设每页200条数据,这样使用e.Row.GetIndex()方法判断是否等于页数*200,如果成立,就调用下一页的数据。

以上只是一个思路,具体的情况需要和需求一致,不过这两个认识确实能给我们理解Silverlight的线程架构带来很大的帮助。希望对大家有所帮助,同时如果有不准确的地方也希望指出来,共同学习。

这篇博客也指出了一些这样的认识,并且说明了Silverlight5中对其进行的有限的改进,如果有兴趣的朋友可以看看。

Silverlight 5.0 实战演示项目完整示例 Silverlight是微软推出的富互联网应用(RIA)开发框架,采用插件式架构运行于浏览器沙箱环境中,依托.NET运行时子集实现跨平台UI渲染。其核心由XAML负责界面声明,通过解析XML标记构建可视化元素树,并结合C#或VB.NET编写事件逻辑,在客户端执行托管代码。// 典型的Silverlight应用入口点// 加载主页面该框架支持与HTML DOM深度互操作,可通过调用JavaScript函数,反之亦然,实现了Web前端融合编程。 阅读详情

相关推荐

STM32G4实战:用CubeMX+Keil五分钟搞定FreeRTOS多任务LED控制(避坑指南)

本文详细介绍了如何在STM32G4系列芯片上使用CubeMX和Keil快速配置FreeRTOS实现多任务LED控制,包括环境准备、时钟配置、任务创建及常见问题解决方案。重点解决了时钟源冲突等高频问题,并提供了优化建议和进阶应用示例,帮助开发者高效完成嵌入式开发任务。

joy55的博客 223

Silverlight之各种线程的操作

Silverlight中经常会用到多线程来处理一些复杂的业务,或者是过程较长的业务,下面为大家总结了Silverlight常用的处理多线程的方法。 主要使用的对象如下: 1.System.ComponentModel.BackgroundWorker 2.System.Threading.Interlocked 3.lock关键字 4.Thread 5.ThreadPool 6.Ev...

weixin_30371875的博客 193

GOM引擎单机传奇架设全攻略——从DBC2000配置到登录器生成

本文详细解析了使用GOM引擎架设单机传奇的完整流程,从DBC2000的安装配置、服务端部署、引擎控制器设置,到登录器生成与客户端补丁放置。文章重点解决了单机架设中的常见问题,如数据库路径配置、IP地址设置及Key.lic文件处理,旨在帮助玩家快速搭建稳定的个人游戏环境,体验GM乐趣。

weixin_28318011的博客 630

在WPF/Silverlight中管理Frame导航事件与后台多线程

在WPF的上位机开发中,当我们一个程序中有多个画面,在每个后面的后台可能需要多个进程需要对下位机的数据进行重复的读取或者处理,但当切换不同的界面后,page界面没有在视觉树上,那么需要结束后台的进程,若不结束那么再次回到该界面后台的进程将会重新拉起,极大的消耗内存。类的一个受保护方法,用于处理窗口关闭事件。事件,并在事件处理程序中调用ViewModel中的一个方法,当page页面没有在视觉树上时,调用后台的关闭线程函数,销毁当前的线程。在你的视图(View)的后台代码(CS文件)中,当你设置。

weixin_67244432的博客 477

训练集、验证集、测试集!YOLO系列标签数量统计!

【代码】训练集、验证集、测试集!YOLO系列标签数量统计!

qq_26281057的博客 649

告别传统RAG的痛点!Agent Skills让知识库检索更智能(本地知识库搭建新思路:用Agent Skills实现渐进式检索)

传统RAG在知识库检索中存在文档结构丢失、Token消耗大等问题 📚 Agent Skills通过分层索引、渐进式检索等设计,实现了更智能的本地知识库检索方案 🤖 本文详细介绍了Agent Skills的核心设计理念、与传统RAG的对比以及实践建议,帮助你搭建高效的知识库系统 ✅

XiaoqiangClub的博客 693

Silverlight的多线程能力(上)

对于多线程其实一直以来都存在很多误区:比如多任务与多线程就很容易被混为一谈,而多线程也常被理所应当的认为是并行等等。而事实却是:多任务≠多线程、单任务≠单线程、多线程不一定并行,多线程与性能不成线性关系等等,其中道理在这里不再详述。笔者认为Silverlight多线程主要作用不是在于提高性能,而是在于用户体验,其根本目的是解决用户体验中的响应速度,减少单线程带来的阻塞问题。用一个贴切的例子来形容单...

cpongo5 234

锂电池的充电和放电曲线解读

锂电池充放电曲线是反映其性能的关键指标。充电曲线分为恒流和恒压两阶段:恒流阶段电压快速上升,恒压阶段电流逐渐降低;放电曲线则呈现平台期和快速衰减期特征。这些曲线受温度、充放电倍率及材料体系(如三元锂或磷酸铁锂)显著影响。通过分析曲线特征,可优化电池管理系统,实现精准的SOC估算、快充策略制定及故障诊断,从而在电池性能与安全性间取得平衡。不同应用场景(如新能源汽车或消费电子)对曲线形态有特定要求。

start_up_go的博客 5067

zt:Silverlight 4中四种多线程编程技术

Silverlight 4中四种多线程编程技术 时间:2011-05-16 05:35来源:IT168作者:朱先忠 1.使用WaitHandle   等待句柄应当是你进行多线程编程的必备装备。由于我们的主要兴趣点在于Silverlight多线程编程相关的内容,所以我们不想再深入探讨WaitHandle。但在此为你提供一个典型的例子,告诉你使用WaitHandle的基本方法。 ...

weixin_30664051的博客 214

微信小程序逆向实战:从HTTPS抓包到API接口全解构

方案原理优点缺点方案一:使用低版本微信+系统代理微信7.0以下版本未强制不走代理操作简单容易被封号,无法使用新版小程序方案二:Hook SSL层(Xposed/Frida)动态Hook Java的TrustManager或系统的SSLContext,绕过证书校验灵活可控需要Root/越狱,技术门槛高方案三:VPN转发抓包(PacketCapture)利用Android VPNService将所有流量转发到本地代理无需Root,兼容性好部分机型存在性能问题。

2201_76125261的博客 267

基于STM32L4XX 、HAL库的TMP144YFFR数字温度传感器驱动应用C语言程序设计

define TMP144_ADDRESS 0x00 // 默认为全局地址,用于单器件或MDA命令。#define TMP144_CMD_READ_TEMP 0x00 // 读取温度寄存器命令。if (temp_raw & 0x800) { // 判断第11位(符号位)

PP_Cottage的博客 91

Silverlight的多线程能力(下)

上一期笔者介绍了Silverlight实现多线程的诸多解决方案,本期笔者将通过一个实例来实现所有多线程编程方法,并且还将于JavaScript和Flash两种Web客户端技术性能进行比较,请勿拍砖。\u0026#xD;\n在正式编程前,笔者还要重申上期非常重要的观点:Silverlight多线程主要作用不是在于提高性能,而是在于用户体验。这里要给多线程泼一盆冷水了,多线程与性能提升不是正比关系,如...

啊啊啊啊2 353

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Silverlight 4中四种多线程编程技术

1.使用WaitHandle   等待句柄应当是你进行多线程编程的必备装备。由于我们的主要兴趣点在于Silverlight多线程编程相关的内容,所以我们不想再深入探讨WaitHandle。但在此为你提供一个典型的例子,告诉你使用WaitHandle的基本方法。   清单1:      public partial class MainPage : UserControl   Au...

weixin_30655219的博客 67

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

需要继续掌握的知识点

平台类:CLR、BCL 方向类:设计模式、UML、C#、C++、WP7、数据库、Linq、Silverlight 具体知识点:silverlight的依赖属性、数据绑定、模板,MVVM模式,多线程 时间安排: 9月份:.NET内功修炼 目标: 一定程度上了解学习.NET的一些底层知识点和各种机制,如CLR,FCL,IL语言,元数据,JIT编译器,托管模块,程序集,内...

weixin_33708432的博客 95

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

silverlight中多线程总结

  在Silverlight中引入多线程的根本动机主要是为了解决用户体验中的响应速度,进而减少单线程带来的阻塞问题。 把我自己从测试以及其他人的文章中得出的理解分享一下,有不对的地方也请指正:   第一条是,Silverlight只有一个主线程,也就是我们常说的UI线程。   第二条是这个主线程实际上负责很多的事情,例如,处理用户输入,呈现页面,运行动画等等。 下面先来写一个小例...

aa124413278的博客 207

(转)Silverlight多线程能力(下)

上一期笔者介绍了Silverlight实现多线程的诸多解决方案,本期笔者将通过一个实例来实现所有多线程编程方法,并且还将于JavaScript和Flash两种Web客户端技术性能进行比较,请勿拍砖。   在正式编程前,笔者还要重申上期非常重要的观点:Silverlight多线程主要作用不是在于提高性能,而是在于用户体验。这里要给多线程泼 一盆冷水了,多线程与性能提升不是正比关系,如果...

diaoliti2465的博客 196

silverlight多线程学习(一)Thread

<br />Thread线程<br /> <br />注意要点<br />一、不能直接访问UI线程。也就是和UI界面同步,一同步也就是操作和更新UI界面。这时候UI线程自然就会阻塞。这个在DispatcherTimer定时器是可以直接访问更新UI界面的线程。在DispatcherTimer线程里会有介绍。<br />二、如果需要跟新访问UI界面元素稍稍代码上优点小繁琐。<br /> <br />silverlight+WCF开发,由于WCF默认方式为异步。虽然能实现WCF同步。但是,是以阻塞线程达到的。线程

蜗牛水里爬 2223

Silverlight 的多线程能力(下“.NET技术”)

  上一期笔者介绍了Silverlight实现多线程的诸多解决方案,本期笔者将通过一个实例来实现所有多线程编程方法,并且还将于JavaScript和Flash两种Web客户端技术性能进行比较,请勿拍砖。   在正式编程前,笔者还要重申上期非常重要的观点:Silverlight多线程主要作用不是在于提高性能,而是在于用户体验。这里要给多线程泼一盆冷水了,多线程与性能提升不是正比关系,如果你使用一个单...

weixin_34221276的博客 148

zt:Silverlight的多线程能力

Silverlight的多线程能力 作者吴磊发布于 2011年3月22日 笔者将通过一个实例来实现所有多线程编程方法,并且还将于JavaScript和Flash两种Web客户端技术性能进行比较,请勿拍砖。 在正式编程前,笔者还要重申上期非常重要的观点:Silverlight多线程主要作用不是在于提高性能,而是在于用户体验。 这里要给多线程泼一盆冷水了,多线程与性能提升不是正比关...

weixin_30951743的博客 165

一起谈.NET技术,Silverlight 的多线程能力(下)

  上一期笔者介绍了Silverlight实现多线程的诸多解决方案,本期笔者将通过一个实例来实现所有多线程编程方法,并且还将于JavaScript和Flash两种Web客户端技术性能进行比较,请勿拍砖。   在正式编程前,笔者还要重申上期非常重要的观点:Silverlight多线程主要作用不是在于提高性能,而是在于用户体验。这里要给多线程泼一盆冷水了,多线程与性能提升不是正比关系,如果你使用一个单...

weixin_34380781的博客 93

silverlight多线程学习(二) DispatcherTimer

<br />DispatcherTimer 线程<br />注意要点:<br />一、能直接访问并操作UI界面元素。<br />二、需要注意会造成UI线程阻塞,就是界面卡机的情况。<br />可以理解为占用UI线程,因为它可以直接访问并更新UI。这种线程一般不推荐使用。这种线程实际上会造成UI线程的阻塞,其它线程也可以造成线程阻塞。主要是这种线程在它的Tick事件中执行的都是占用UI线程,也就是说它在执行定时器事件的时候会和UI界面线程同步。如果是后台线程使用的不当,写的不好的话。其线程也会造成页面卡机。以

蜗牛水里爬 2325
上一篇: 解决异常Unable to determine the provider name for connection of type SqlCeConnection的方法之一
下一篇: 使用WinDbg调试Silverlight中遇到“Failed to find runtime DLL (clr.dll), 0x80004005”问题的解决方法之一
熊坚强
博客等级 码龄18年 5粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值