博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool
阅读量:5888 次
发布时间:2019-06-19

本文共 11100 字,大约阅读时间需要 37 分钟。




稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool


作者:



介绍

Silverlight 2.0 使用Thread, Timer, BackgroundWorker, ThreadPool来实现多线程开发

    Thread - 用于线程的创建和控制的类

    Timer - 用于以指定的时间间隔执行指定的方法的类

    BackgroundWorker - 用于在单独的线程上运行操作

    ThreadPool - 线程池的管理类



在线DEMO




示例

1、Thread.xaml
<UserControl x:Class="Silverlight20.Thread.Thread" 

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

        <StackPanel HorizontalAlignment="Left" Margin="5"> 

         

                <TextBlock x:Name="txtMsg" /> 

         

        </StackPanel> 

</UserControl>
 
Thread.xaml.cs
InBlock.gif
using System; 

InBlock.gif
using System.Collections.Generic; 

InBlock.gif
using System.Linq; 

InBlock.gif
using System.Net; 

InBlock.gif
using System.Windows; 

InBlock.gif
using System.Windows.Controls; 

InBlock.gif
using System.Windows.Documents; 

InBlock.gif
using System.Windows.Input; 

InBlock.gif
using System.Windows.Media; 

InBlock.gif
using System.Windows.Media.Animation; 

InBlock.gif
using System.Windows.Shapes; 

InBlock.gif 

InBlock.gif
namespace Silverlight20.Thread 

InBlock.gif

InBlock.gif        
public partial 
class Thread : UserControl 

InBlock.gif        { 

InBlock.gif                
string result = ""; 

InBlock.gif 

InBlock.gif                
public Thread() 

InBlock.gif                { 

InBlock.gif                        InitializeComponent(); 

InBlock.gif 

InBlock.gif                        Demo(); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
void Demo() 

InBlock.gif                { 

InBlock.gif                        
/* 
InBlock.gif                         * Thread - 用于线程的创建和控制的类 
InBlock.gif                         *         Name - 线程名称 
InBlock.gif                         *         IsBackground - 是否是后台线程(对于Silverlight来说,是否是后台线程没区别) 
InBlock.gif                         *         Start(object parameter) - 启动后台线程 
InBlock.gif                         *                 object parameter - 为后台线程传递的参数 
InBlock.gif                         *         IsAlive - 线程是否在执行中 
InBlock.gif                         *         ManagedThreadId - 当前托管线程的唯一标识符 
InBlock.gif                         *         ThreadState - 指定线程的状态 [System.Threading.ThreadState枚举] 
InBlock.gif                         *         Abort() - 终止线程 
InBlock.gif                         */
 

InBlock.gif 

InBlock.gif                        
// DoWork 是后台线程所执行的方法(此处省略掉了委托类型) 

InBlock.gif                        
// ThreadStart 委托不可以带参数, ParameterizedThreadStart 委托可以带参数 

InBlock.gif                        System.Threading.Thread thread = 
new System.Threading.Thread(DoWork); 

InBlock.gif                        thread.Name = 
"ThreadDemo"

InBlock.gif                        thread.IsBackground = 
true

InBlock.gif                        thread.Start(1000); 

InBlock.gif 

InBlock.gif                        result += thread.IsAlive + 
"\r\n"

InBlock.gif                        result += thread.ManagedThreadId + 
"\r\n"

InBlock.gif                        result += thread.Name + 
"\r\n"

InBlock.gif                        result += thread.ThreadState + 
"\r\n"

InBlock.gif 

InBlock.gif                        
// thread.Join(); 阻塞调用线程(本例为主线程),直到指定线程(本例为thread)执行完毕为止 

InBlock.gif 

InBlock.gif                        
// 阻塞调用线程(本例为主线程) 

InBlock.gif                        
// 如果指定线程执行完毕则继续(本例为thread执行完毕则继续) 

InBlock.gif                        
// 如果指定线程运行的时间超过指定时间则继续(本例为thread执行时间如果超过5秒则继续) 

InBlock.gif                        
// 返回值为在指定时间内指定线程是否执行完毕(本例中thread的执行时间为1秒,所以会返回true)

InBlock.gif                        
if (thread.Join(5000))    

InBlock.gif                        { 

InBlock.gif                                result += 
"指定线程在5秒内执行完毕\r\n"

InBlock.gif                        } 

InBlock.gif 

InBlock.gif                        txtMsg.Text = result; 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
void DoWork(
object sleepMillisecond) 

InBlock.gif                { 

InBlock.gif                        System.Threading.Thread.Sleep((
int)sleepMillisecond); 

InBlock.gif 

InBlock.gif                        result += 
"新开线程执行完毕\r\n"

InBlock.gif                } 

InBlock.gif        } 

InBlock.gif}
 
2、Timer.xaml
<UserControl x:Class="Silverlight20.Thread.Timer" 

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

        <StackPanel HorizontalAlignment="Left" Margin="5"> 

         

                <TextBlock x:Name="txtMsg" /> 

         

        </StackPanel> 

</UserControl>
 
Timer.xaml.cs
InBlock.gif
using System; 

InBlock.gif
using System.Collections.Generic; 

InBlock.gif
using System.Linq; 

InBlock.gif
using System.Net; 

InBlock.gif
using System.Windows; 

InBlock.gif
using System.Windows.Controls; 

InBlock.gif
using System.Windows.Documents; 

InBlock.gif
using System.Windows.Input; 

InBlock.gif
using System.Windows.Media; 

InBlock.gif
using System.Windows.Media.Animation; 

InBlock.gif
using System.Windows.Shapes; 

InBlock.gif 

InBlock.gif
namespace Silverlight20.Thread 

InBlock.gif

InBlock.gif        
public partial 
class Timer : UserControl 

InBlock.gif        { 

InBlock.gif                System.Threading.SynchronizationContext _syncContext; 

InBlock.gif                
// Timer - 用于以指定的时间间隔执行指定的方法的类 

InBlock.gif                System.Threading.Timer _timer; 

InBlock.gif                
private 
int _flag = 0; 

InBlock.gif 

InBlock.gif                
public Timer() 

InBlock.gif                { 

InBlock.gif                        InitializeComponent(); 

InBlock.gif 

InBlock.gif                        
// UI 线程 

InBlock.gif                        _syncContext = System.Threading.SynchronizationContext.Current; 

InBlock.gif 

InBlock.gif                        Demo(); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
void Demo() 

InBlock.gif                { 

InBlock.gif                        
// 输出当前时间 

InBlock.gif                        txtMsg.Text = DateTime.Now.ToString() + 
"\r\n"

InBlock.gif 

InBlock.gif                        
// 第一个参数:定时器需要调用的方法 

InBlock.gif                        
// 第二个参数:传给需要调用的方法的参数 

InBlock.gif                        
// 第三个参数:此时间后启动定时器 

InBlock.gif                        
// 第四个参数:调用指定方法的间隔时间(System.Threading.Timeout.Infinite 为无穷大) 

InBlock.gif                        _timer = 
new System.Threading.Timer(MyTimerCallback, 
"webabcd", 3000, 1000); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
private 
void MyTimerCallback(
object state) 

InBlock.gif                { 

InBlock.gif                        
string result = 
string.Format(
"{0} - {1}\r\n", DateTime.Now.ToString(), (
string)state); 

InBlock.gif 

InBlock.gif                        
// 调用 UI 线程。不会做自动线程同步 

InBlock.gif                        _syncContext.Post(
delegate { txtMsg.Text += result; }, 
null);    

InBlock.gif 

InBlock.gif                        _flag++; 

InBlock.gif                        
if (_flag == 5) 

InBlock.gif                                _timer.Change(5000, 500); 
// 执行5次后,计时器重置为5秒后启动,每5毫秒的间隔时间执行一次指定的方法 

InBlock.gif                        
else 
if (_flag == 10) 

InBlock.gif                                _timer.Dispose(); 
// 执行10次后,释放计时器所使用的全部资源 

InBlock.gif                } 

InBlock.gif        } 

InBlock.gif}
 
 
3、BackgroundWorker.xaml
<UserControl x:Class="Silverlight20.Thread.BackgroundWorker" 

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

        <StackPanel HorizontalAlignment="Left" Margin="5"> 


                <StackPanel Orientation="Horizontal" Margin="5"> 

                        <Button x:Name="btnStart" Content="开始" Margin="5" Click="btnStart_Click" /> 

                        <Button x:Name="btnCancel" Content="取消" Margin="5" Click="btnCancel_Click" /> 

                </StackPanel> 

                 

                <StackPanel Margin="5"> 

                        <TextBlock x:Name="txtProgress" Margin="5" /> 

                        <TextBlock x:Name="txtMsg" Margin="5" /> 

                </StackPanel> 


        </StackPanel>    

</UserControl>
 
BackgroundWorker.xaml.cs
InBlock.gif
/* 
InBlock.gif * 演示用 BackgroundWorker 在后台线程上执行耗时的操作 
InBlock.gif * 按“开始”键,开始在后台线程执行耗时操作,并向UI线程汇报执行进度 
InBlock.gif * 按“取消”键,终止后台线程 
InBlock.gif * BackgroundWorker 调用 UI 线程时会自动做线程同步 
InBlock.gif */
 

InBlock.gif 

InBlock.gif
using System; 

InBlock.gif
using System.Collections.Generic; 

InBlock.gif
using System.Linq; 

InBlock.gif
using System.Net; 

InBlock.gif
using System.Windows; 

InBlock.gif
using System.Windows.Controls; 

InBlock.gif
using System.Windows.Documents; 

InBlock.gif
using System.Windows.Input; 

InBlock.gif
using System.Windows.Media; 

InBlock.gif
using System.Windows.Media.Animation; 

InBlock.gif
using System.Windows.Shapes; 

InBlock.gif 

InBlock.gif
namespace Silverlight20.Thread 

InBlock.gif

InBlock.gif        
public partial 
class BackgroundWorker : UserControl 

InBlock.gif        { 

InBlock.gif                
// BackgroundWorker - 用于在单独的线程上运行操作。例如可以在非UI线程上运行耗时操作,以避免UI停止响应 

InBlock.gif                System.ComponentModel.BackgroundWorker _backgroundWorker; 

InBlock.gif 

InBlock.gif                
public BackgroundWorker() 

InBlock.gif                { 

InBlock.gif                        InitializeComponent(); 

InBlock.gif 

InBlock.gif                        BackgroundWorkerDemo(); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
void BackgroundWorkerDemo() 

InBlock.gif                { 

InBlock.gif                        
/* 
InBlock.gif                         * WorkerSupportsCancellation - 是否支持在其他线程中取消该线程的操作 
InBlock.gif                         * WorkerReportsProgress - 是否可以报告操作进度 
InBlock.gif                         * ProgressChanged - 报告操作进度时触发的事件 
InBlock.gif                         * DoWork - BackgroundWorker 调用 RunWorkerAsync() 方法时触发的事件。在此执行具体操作 
InBlock.gif                         * RunWorkerCompleted - 操作完成/取消/出错时触发的事件 
InBlock.gif                         */
 

InBlock.gif 

InBlock.gif                        _backgroundWorker = 
new System.ComponentModel.BackgroundWorker(); 

InBlock.gif 

InBlock.gif                        _backgroundWorker.WorkerSupportsCancellation = 
true

InBlock.gif                        _backgroundWorker.WorkerReportsProgress = 
true

InBlock.gif 

InBlock.gif                        _backgroundWorker.ProgressChanged += 
new System.ComponentModel.ProgressChangedEventHandler(_backgroundWorker_ProgressChanged); 

InBlock.gif                        _backgroundWorker.DoWork += 
new System.ComponentModel.DoWorkEventHandler(_backgroundWorker_DoWork); 

InBlock.gif                        _backgroundWorker.RunWorkerCompleted += 
new System.ComponentModel.RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
private 
void btnStart_Click(
object sender, RoutedEventArgs e) 

InBlock.gif                { 

InBlock.gif                        
// IsBusy - 指定的 BackgroundWorker 是否正在后台操作 

InBlock.gif                        
// RunWorkerAsync(object argument) - 开始在后台线程执行指定的操作 

InBlock.gif                        
//         object argument - 需要传递到 DoWork 的参数 

InBlock.gif                        
if (!_backgroundWorker.IsBusy) 

InBlock.gif                                _backgroundWorker.RunWorkerAsync(
"需要传递的参数"); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
private 
void btnCancel_Click(
object sender, RoutedEventArgs e) 

InBlock.gif                { 

InBlock.gif                        
// CancelAsync() - 取消 BackgroundWorker 正在执行的后台操作 

InBlock.gif                        
if (_backgroundWorker.WorkerSupportsCancellation) 

InBlock.gif                                _backgroundWorker.CancelAsync(); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
void _backgroundWorker_DoWork(
object sender, System.ComponentModel.DoWorkEventArgs e) 

InBlock.gif                { 

InBlock.gif                        
/* 
InBlock.gif                         * DoWorkEventArgs.Argument - RunWorkerAsync(object argument)传递过来的参数 
InBlock.gif                         * DoWorkEventArgs.Cancel - 取消操作 
InBlock.gif                         * DoWorkEventArgs.Result - 操作的结果。将传递到 RunWorkerCompleted 所指定的方法 
InBlock.gif                         * BackgroundWorker.ReportProgress(int percentProgress, object userState) - 向 ProgressChanged 汇报操作的完成进度 
InBlock.gif                         *         int percentProgress - 操作完成的百分比 1% - 100% 
InBlock.gif                         *         object userState - 传递到 ProgressChanged 的参数 
InBlock.gif                         */
 

InBlock.gif 

InBlock.gif                        
for (
int i = 0; i < 10; i++) 

InBlock.gif                        { 

InBlock.gif                                
if ((_backgroundWorker.CancellationPending == 
true)) 

InBlock.gif                                { 

InBlock.gif                                        e.Cancel = 
true

InBlock.gif                                        
break

InBlock.gif                                } 

InBlock.gif                                
else 

InBlock.gif                                { 

InBlock.gif                                        System.Threading.Thread.Sleep(1000); 

InBlock.gif                                        _backgroundWorker.ReportProgress((i + 1) * 10, i); 

InBlock.gif                                } 

InBlock.gif                        } 

InBlock.gif 

InBlock.gif                        e.Result = 
"操作已完成"

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
void _backgroundWorker_ProgressChanged(
object sender, System.ComponentModel.ProgressChangedEventArgs e) 

InBlock.gif                { 

InBlock.gif                        
// ProgressChangedEventArgs.ProgressPercentage - ReportProgress 传递过来的操作完成的百分比 

InBlock.gif                        
// ProgressChangedEventArgs.UserState - ReportProgress 传递过来的参数 

InBlock.gif                        txtProgress.Text = 
string.Format(
"完成进度:{0}%;参数:{1}"

InBlock.gif                                e.ProgressPercentage, 

InBlock.gif                                e.UserState); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
void _backgroundWorker_RunWorkerCompleted(
object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) 

InBlock.gif                { 

InBlock.gif                        
/* 
InBlock.gif                         * RunWorkerCompletedEventArgs.Error - DoWork 时产生的错误 
InBlock.gif                         * RunWorkerCompletedEventArgs.Cancelled - 后台操作是否已被取消 
InBlock.gif                         * RunWorkerCompletedEventArgs.Result - DoWork 的结果 
InBlock.gif                         */
 

InBlock.gif 

InBlock.gif                        
if (e.Error != 
null

InBlock.gif                        { 

InBlock.gif                                txtMsg.Text += e.Error.ToString() + 
"\r\n"

InBlock.gif                        } 

InBlock.gif                        
else 
if (e.Cancelled) 

InBlock.gif                        { 

InBlock.gif                                txtMsg.Text += 
"操作被取消\r\n"

InBlock.gif                        } 

InBlock.gif                        
else 

InBlock.gif                        { 

InBlock.gif                                txtMsg.Text += e.Result.ToString() + 
"\r\n"

InBlock.gif                        } 

InBlock.gif                } 

InBlock.gif        } 

InBlock.gif}
 
 
4、ThreadPool.xaml
<UserControl x:Class="Silverlight20.Thread.ThreadPool" 

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

        <StackPanel HorizontalAlignment="Left" Margin="5"> 


                <TextBlock x:Name="txtMsgQueueUserWorkItem" Text="click here" MouseLeftButtonDown="txtMsgQueueUserWorkItem_MouseLeftButtonDown" Margin="30" /> 


                <TextBlock x:Name="txtRegisterWaitForSingleObject" Text="click here" MouseLeftButtonDown="txtRegisterWaitForSingleObject_MouseLeftButtonDown" Margin="30" /> 


        </StackPanel> 

</UserControl>
 
ThreadPool.xaml.cs
InBlock.gif
using System; 

InBlock.gif
using System.Collections.Generic; 

InBlock.gif
using System.Linq; 

InBlock.gif
using System.Net; 

InBlock.gif
using System.Windows; 

InBlock.gif
using System.Windows.Controls; 

InBlock.gif
using System.Windows.Documents; 

InBlock.gif
using System.Windows.Input; 

InBlock.gif
using System.Windows.Media; 

InBlock.gif
using System.Windows.Media.Animation; 

InBlock.gif
using System.Windows.Shapes; 

InBlock.gif 

InBlock.gif
namespace Silverlight20.Thread 

InBlock.gif

InBlock.gif        
public partial 
class ThreadPool : UserControl 

InBlock.gif        { 

InBlock.gif                
public ThreadPool() 

InBlock.gif                { 

InBlock.gif                        InitializeComponent(); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
private 
void txtMsgQueueUserWorkItem_MouseLeftButtonDown(
object sender, MouseButtonEventArgs e) 

InBlock.gif                { 

InBlock.gif                        
// ThreadPool - 线程池的管理类 

InBlock.gif 

InBlock.gif                        
// QueueUserWorkItem(WaitCallback callBack, Object state) - 将指定方法加入线程池队列 

InBlock.gif                        
//         WaitCallback callBack - 需要在新开线程里执行的方法 

InBlock.gif                        
//         Object state - 传递给指定方法的参数 

InBlock.gif                        System.Threading.ThreadPool.QueueUserWorkItem(DoWork, DateTime.Now); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
private 
void DoWork(
object state) 

InBlock.gif                { 

InBlock.gif                        
// 作为线程管理策略的一部分,线程池在创建线程前会有一定的延迟 

InBlock.gif                        
// 也就是说线程入队列的时间和线程启动的时间之间有一定的间隔 

InBlock.gif 

InBlock.gif                        DateTime dtJoin = (DateTime)state; 

InBlock.gif                        DateTime dtStart = DateTime.Now; 

InBlock.gif                        System.Threading.Thread.Sleep(3000); 

InBlock.gif                        DateTime dtEnd = DateTime.Now; 

InBlock.gif 

InBlock.gif                        
// Dispatcher.BeginInvoke() - 在与 Dispatcher 相关联的线程上执行指定的操作。自动线程同步 

InBlock.gif                        
this.Dispatcher.BeginInvoke(() => 

InBlock.gif                        { 

InBlock.gif                                txtMsgQueueUserWorkItem.Text += 
string.Format(
"\r\n入队列时间{0} 启动时间{1} 完成时间{2}"

InBlock.gif                                        dtJoin.ToString(), dtStart.ToString(), dtEnd.ToString()); 

InBlock.gif                        }); 

InBlock.gif                } 

InBlock.gif 

InBlock.gif 

InBlock.gif                
private 
void txtRegisterWaitForSingleObject_MouseLeftButtonDown(
object sender, MouseButtonEventArgs e) 

InBlock.gif                { 

InBlock.gif                        System.Threading.AutoResetEvent done = 
new System.Threading.AutoResetEvent(
false); 

InBlock.gif 

InBlock.gif                        
// 为了传递 RegisteredWaitHandle 对象,要将其做一个封装 

InBlock.gif                        RegisteredWaitHandlePacket packet = 
new RegisteredWaitHandlePacket(); 

InBlock.gif 

InBlock.gif                        
// RegisterWaitForSingleObject - 注册一个 WaitHandle 。在超时或发信号的情况下对指定的回调方法做调用 

InBlock.gif                        
// 第一个参数:需要注册的 WaitHandle 

InBlock.gif                        
// 第二个参数:需要回调的方法(此处省略掉了委托类型) 

InBlock.gif                        
// 第三个参数:传递给回调方法的参数 

InBlock.gif                        
// 第四个参数:超时时间(到超时时间则调用指定的方法) 

InBlock.gif                        
// 第五个参数:是否为一次调用(是到超时时间一次性调用指定的方法,还是每次超时时间后都调用指定的方法) 

InBlock.gif                        packet.Handle = System.Threading.ThreadPool.RegisterWaitForSingleObject 

InBlock.gif                                ( 

InBlock.gif                                        done, 

InBlock.gif                                        WaitOrTimer, 

InBlock.gif                                        packet, 

InBlock.gif                                        100, 

InBlock.gif                                        
false 

InBlock.gif                                ); 

InBlock.gif 

InBlock.gif                        System.Threading.Thread.Sleep(555); 

InBlock.gif                        done.Set(); 
// 发出信号,调用 RegisterWaitForSingleObject 所指定的方法 

InBlock.gif                } 

InBlock.gif 

InBlock.gif                
public 
void WaitOrTimer(
object state, 
bool timedOut) 

InBlock.gif                { 

InBlock.gif                        RegisteredWaitHandlePacket packet = state 
as RegisteredWaitHandlePacket; 

InBlock.gif 

InBlock.gif                        
// bool timedOut - 是否是因为超时而执行到这里 

InBlock.gif                        
if (!timedOut)    

InBlock.gif                        { 

InBlock.gif                                
// 如果不是因为超时而执行到这里(即因为 AutoResetEvent 发出了信号而执行到这里),则注销指定的 RegisteredWaitHandle 

InBlock.gif                                packet.Handle.Unregister(
null); 

InBlock.gif                        } 

InBlock.gif 

InBlock.gif                        
this.Dispatcher.BeginInvoke(() => 

InBlock.gif                        { 

InBlock.gif                                txtRegisterWaitForSingleObject.Text += 

InBlock.gif                                        String.Format(
"\r\n是否收到信号:{0}", (!timedOut).ToString()); 

InBlock.gif                        }); 

InBlock.gif                } 

InBlock.gif        } 

InBlock.gif 

InBlock.gif        
/// <summary> 

InBlock.gif        
/// 封装了 RegisteredWaitHandle 的类 

InBlock.gif        
/// </summary> 

InBlock.gif        
public 
class RegisteredWaitHandlePacket 

InBlock.gif        { 

InBlock.gif                
public System.Threading.RegisteredWaitHandle Handle { get; set; } 

InBlock.gif        } 

InBlock.gif}
 
 
OK
     本文转自webabcd 51CTO博客,原文链接:http://blog.51cto.com/webabcd/343906
,如需转载请自行联系原作者
你可能感兴趣的文章
关于RF在实践WEB UI自动化测试时,碰到的问题
查看>>
解决Maven项目中jar包依赖冲突问题
查看>>
Pairing Heap模板
查看>>
2016的ChinaJoy沦为ChinaVR?
查看>>
Unity Shaders and Effets Cookbook
查看>>
cairo-1.14.6 static compiler msys mingw32
查看>>
Mac osx 下让android 模拟器横屏
查看>>
SQL创建触发器
查看>>
喜爱看剑雨,数据流的本人对各主角…
查看>>
luogu P1387 最大正方形
查看>>
Android图片圆角效果
查看>>
MSSQL跨服务器数据库查询
查看>>
WeChat Official Account Admin Platform API Introduction
查看>>
C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)
查看>>
poj1635
查看>>
C# LINQ详解(一)
查看>>
视频直播点播nginx-rtmp开发手册中文版
查看>>
iphone 添加CFNetwork.framework时,报错 socket
查看>>
ruby学习总结04
查看>>
Binary Tree Paths
查看>>