相关疑难解决方法(0)

使用超时取消静态异步功能

如果需要超过2分钟,我需要取消UpdateDatabase()函数.我已经尝试过canceltokens计时器,但我无法解决这个问题(找不到任何合适的例子).

你能帮帮我吗?

App.xaml.cs

protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
   await PerformDataFetch();
}

internal async Task PerformDataFetch()
{
   await LocalStorage.UpdateDatabase();
}
Run Code Online (Sandbox Code Playgroud)

LocalStorage.cs

public async static Task<bool> UpdateDatabase()
{
  await ..// DOWNLOAD FILES
  await ..// CHECK FILES
  await ..// RUN CONTROLES
}
Run Code Online (Sandbox Code Playgroud)

根据答案编辑我的课程.

App.xaml.cs保持不变.编辑UpdateDatabase()并在LocalStorage.cs中添加新方法RunUpdate():

public static async Task UpdateDatabase()
{
    CancellationTokenSource source = new CancellationTokenSource();
    source.CancelAfter(TimeSpan.FromSeconds(30)); // how much time has the update process
    Task<int> task = Task.Run(() => RunUpdate(source.Token), …
Run Code Online (Sandbox Code Playgroud)

c# c#-5.0 microsoft-metro windows-runtime winrt-async

7
推荐指数
1
解决办法
1610
查看次数

.net异步套接字超时检查线程安全

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

从上面的msdn示例开始,我正在尝试编写一个超时检查,它将关闭非活动的客户端套接字并释放资源.

这就是我想出的.但我不确定它是否完全是线程安全的,如果有更好的方法可以做到这一点.我希望有人可以给出一些建议.

void IO_Completed(object sender, SocketAsyncEventArgs e)
{
    if (e.SocketError != SocketError.Success)
    {
        CloseClientSocket(e);
        return;
    }

    if (1 < Interlocked.CompareExchange(ref token.Status, 1, 0))
        return;

    switch (e.LastOperation)
    {
        case SocketAsyncOperation.Receive:
            ProcessReceive(e);
            break;
        ...
    }

    token.LastActive = Environment.TickCount;
    Interlocked.CompareExchange(ref token.Status, 0, 1);
}

void ProcessReceive(SocketAsyncEventArgs e)
{
    AsyncUserToken token = (AsyncUserToken)e.UserToken;
    if (e.BytesTransferred > 0)
        if (!token.Socket.SendAsync(e))
            ProcessSend(e);
    else
        CloseClientSocket(e);
}

void ProcessSend(SocketAsyncEventArgs e)
{
    AsyncUserToken token = (AsyncUserToken)e.UserToken;
    if (!token.Socket.ReceiveAsync(e))
        ProcessReceive(e);
}
Run Code Online (Sandbox Code Playgroud)

TimeoutCheck将每20秒执行一次.allReadWriteArgs是一个包含所有SocketAsyncEventArgs的数组.关闭套接字后,将使用SocketError.OperationAborted调用IO_Completed.

void TimeoutCheck(object state)
{
    AsyncUserToken token;
    int …
Run Code Online (Sandbox Code Playgroud)

c# sockets multithreading asynchronous timeout

5
推荐指数
1
解决办法
6305
查看次数